Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

vagrantその19-44 cakephp入門をやってみる(複数Modelの連携その3)一対一対応 $hasOne

参考にさせて頂いたページ

複数Modelの連携(3/6):初心者のためのCakePHP2.0 プログラミング入門

cakePHP2.1でjoinーhasOneを使う | CakePHP2.1初心者メモ

ホストマシン環境

ゲストマシン環境

はじめに

基本的には複数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 mail 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つだけが取り出されます)

とのこと。

今回はここまで。