0

私はブログシステムのようなものを持っています。各エントリにはコメントを付けることができます。各コメントはユーザーによって作成されます。

現在、コントローラーの「ビュー」アクションで読み取り機能を使用して、すべてのデータを取得しています。

モデル間の関係はすでに作成されています (belongTo、hasMany ...など)

エントリ ビューが呼び出されると、次のような結果が得られます。

['Entry'] => Array
    (
        [id] => 1
        [body] => 'xxxxxx'
        [...] => ...
    )

[Comment] => Array
    (
        [0] => Array
            (
                [id] => 1
                [user_id] => 1
                [body] => This is an example of a comment guys!
                [created] => 0000-00-00 00:00:00
            )

        [1] => Array
            (
                [id] => 2
                [user_id] => 1
                [body] => This is the 2nd comment!!!
                [created] => 0000-00-00 00:00:00
            )
    )

read 関数を使用して、user_id に関連するユーザー データなど、コメントの「再帰的」データも取得する方法はありますか? (名前などを聞くため)

私は次のようなものを期待しています:

['Entry'] => Array
    (
        [id] => 1
        [body] => xxxxxx
        [...] => ...
    )

[Comment] => Array
    (
        [0] => Array
            (
              [Comment] => Array
                   (
                      [id] => 1
                      [user_id] => 1
                      [body] => This is an example of a comment guys!
                      [created] => 0000-00-00 00:00:00  
                   )

              [User] => Array
                   (
                      [id] => 1
                      [username] => myusername
                      [created] => 0000-00-00 00:00:00  
                   )
            )

        [1] => Array
            (
              [Comment] => Array
                   (
                      [id] => 1
                      [user_id] => 2
                      [body] => fasdfasfaT
                      [created] => 0000-00-00 00:00:00  
                   )

              [User] => Array
                   (
                      [id] => 2
                      [username] => myusername2
                      [created] => 0000-00-00 00:00:00  
                   )
            )
    )

ありがとう。

4

1 に答える 1

1

はい、そうです。

recursive属性によって関連付けの深さを制御するか、containable動作を使用して、含めるモデルを正確に指定できます。AppModel.php( )のすべてのモデルでこの動作を常に有効にします$actsAs = array('Containable');。次に、次のように使用します。

$this->Entry->find('all', array(
    ...
    'contain' => array('Comment' => 'User')
));

結果は次のようになります。

['Entry'] => Array
(
    [id] => 1
    [body] => xxxxxx
    [...] => ...
)

[Comment] => Array
(
    [0] => Array
        (
          [id] => 1
          [user_id] => 1
          [body] => This is an example of a comment guys!
          [created] => 0000-00-00 00:00:00  
          [User] => Array
               (
                  [id] => 1
                  [username] => myusername
                  [created] => 0000-00-00 00:00:00  
               )
        )

)

私の経験では、Cakeは深い関連付けをクエリするのにあまり効率的ではありません。あなたの場合、それぞれCommentがそのをフェッチするためのクエリを生成しますUser。Cakeにコメントのみをフェッチさせ、コメントのユーザーIDを取得し、それらのIDを持つすべてのユーザーを1つのクエリで取得して、そのユーザー情報を元の結果に追加することで、これを回避します。

于 2012-09-24T09:10:38.867 に答える