参考にさせて頂いたページ
複数Modelの連携(3/6):初心者のためのCakePHP2.0 プログラミング入門
cakePHP2.1でjoinーhasOneを使う | CakePHP2.1初心者メモ
ホストマシン環境
ゲストマシン環境
- PHP 5.3.3
- CentOS release 6.6 (Final)
- cakephp2.5.6
- mysql Ver 14.14 Distrib 5.6.21, for Linux (x86_64) using EditLine wrapper
- Apache/2.2.15 (Unix)
はじめに
基本的には複数Modelの連携(3/6):初心者のためのCakePHP2.0 プログラミング入門を参考にさせて頂いて進めた。
勉強の為に、scaffoldは使わずにやってみた。
前回の記事で作成したguest_booksテーブルと連携してみる。
Model/MySampleData.phpの編集と記述内容
これまで書いてきたコードにpublic $hasOne = "GuestBook";
を追記した。
今回の事とは関係の無い部分を省くと、以下のようになっている。
<?php
App::uses('AppModel', 'Model');
class MySampleData extends AppModel {
public $hasOne = "GuestBook";
}
Controller/MySampleDatasController.phpの編集と記述内容
これまで書いてきたコードに、新たにhogeアクションを追記した。
今回の事とは関係の無い部分を省くと、以下のようになっている。
<?php
App::uses('AppController', 'Controller');
class MySampleDatasController extends AppController {
function hoge(){
$datas = $this->MySampleData->find('all');
$this->set('datas',$datas);
}
}
View/MySampleDatas/hoge.ctpの作成と記述内容
hoge.ctpを新たに作成して、以下のように記述した。
<pre>
<?php print_r($datas) ?>
</pre>
guest_booksテーブルの現在の内容
id | content | my_sample_data_id |
---|---|---|
1 | content_1 | 5 |
2 | content_2 | 6 |
3 | content_3 | 7 |
my_sample_dataテーブルの現在の内容
id 8 のレコードは以前deleteしたようなので無い。
id | name | tel | |
---|---|---|---|
1 | name1 | mail1 | tel1 |
2 | name2 | mail2 | tel2 |
3 | name3 | mail3 | tel3 |
4 | name4 | mail4 | tel4 |
5 | name5 | mail5 | tel5 |
6 | name6 | mail6 | tel6 |
7 | name7 | mail7 | tel7 |
9 | name9 | mail9 | tel9 |
10 | name10 | mail10 | tel10 |
ブラウザでアクセスしてみた
http://192.168.33.10/cakephp/my_sample_datas/hogeにアクセスしてみた結果として、print_rで以下のような出力がされた。
Array
(
[0] => Array
(
[MySampleData] => Array
(
[id] => 5
[name] => name5
[mail] => mail5
[tel] => tel5
)
[GuestBook] => Array
(
[id] => 1
[content] => content_1
[my_sample_data_id] => 5
)
)
[1] => Array
(
[MySampleData] => Array
(
[id] => 6
[name] => name6
[mail] => mail6
[tel] => tel6
)
[GuestBook] => Array
(
[id] => 2
[content] => content_2
[my_sample_data_id] => 6
)
)
[2] => Array
(
[MySampleData] => Array
(
[id] => 7
[name] => name7
[mail] => mail7
[tel] => tel7
)
[GuestBook] => Array
(
[id] => 3
[content] => content_3
[my_sample_data_id] => 7
)
)
[3] => Array
(
[MySampleData] => Array
(
[id] => 1
[name] => name1
[mail] => mail1
[tel] => tel1
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
[4] => Array
(
[MySampleData] => Array
(
[id] => 2
[name] => name2
[mail] => mail2
[tel] => tel2
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
[5] => Array
(
[MySampleData] => Array
(
[id] => 3
[name] => name3
[mail] => mail3
[tel] => tel3
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
[6] => Array
(
[MySampleData] => Array
(
[id] => 4
[name] => name4
[mail] => mail4
[tel] => tel4
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
[7] => Array
(
[MySampleData] => Array
(
[id] => 9
[name] => name9
[mail] => mail9
[tel] => tel9
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
[8] => Array
(
[MySampleData] => Array
(
[id] => 10
[name] => name10
[mail] => mail10
[tel] => tel10
)
[GuestBook] => Array
(
[id] =>
[content] =>
[my_sample_data_id] =>
)
)
)
今回のソースについて
cakePHP2.1でjoinーhasOneを使う | CakePHP2.1初心者メモによると、今回使用したpublic $hasOne = "GuestBook";
は色々と略した書き方との事だった。
色々略さずに書くと以下のように書くらしい。
以下は引用のソースコード
<?php
class BlogUser extends AppModel{
public $hasOne = array(
'Blog'=>array(
'className' => 'Blog',
'foreignKey'=> 'blog_user_id',
'type'=>'left',
'conditions'=> array('Blog.published'=>1),
'fields' => array('Blog.*'),
'order'=> array('Blog.id DESC'),
'dependent'=> true
)
);
}
?>
この記事のまとめ
- my_sample_dataテーブルのidが1から10まである(8は無いけど)
- guest_booksテーブルにmy_sample_data_idというフィールドがあるので、それがmy_sample_dataテーブルのidと自動的に紐付く
- 紐付くデータがあるid5,6,7はソートされて上に来て、GuestBookをキーとする連想配列が付いている
- 紐付くデータが無いid1,2,3,4,9,10は下に来て、GuestBookをキーとする連想配列が付いているけど空
$hasOneの場合は、紐付けられるレコードはあくまでも一対一なので、複数Modelの連携(3/6):初心者のためのCakePHP2.0 プログラミング入門によると
GuestBook側で、そのデータに関連付けられたデータが用意されていた場合、MySampleDataの内容の下に、関連するGuestBookのデータが表示されます。MySampleDataとGuestBookが関連付けられて認識されていることがわかるでしょう。(ただし、現段階では、表示されるのは関連付けられたデータ1つのみです。複数のデータが関連付けられている場合は、最初の1つだけが取り出されます)
とのこと。
今回はここまで。