web-dev-qa-db-ja.com

CakePHP 3を使用して複数のテーブルを結合する方法は?

CakePHP 3.xを使用しています。

私が欲しいのは、$ this-> Categories-> find()を呼び出して、Topics.cat_id = Categories.idのトピックに参加し、Posts.topic_id = Topics.idの投稿に参加できるようにすることです。

エラーは発生しませんが、返されるデータはカテゴリデータのみです。LEFTとINNERの結合を試みましたが成功しませんでした。どんな助けも大歓迎です。

テーブルの関係は次のとおりです。

カテゴリー表

$this->hasMany('Topics');

トピックス表

$this->belongsTo('Categories');
$this->hasMany('Posts');

PostsTable

$this->belongsTo('Topics');

また、私が持っているクエリ:

$query = $this->Categories->find('all')
        ->order(['Categories.name' => 'ASC'])
        ->join([
            'topics' => [
                'table' => 'Topics',
                'type' => 'LEFT',
                'conditions' => 'topics.Cat_id = Categories.id'
            ],
            'posts' => [
                'table' => 'Posts',
                'type' => 'LEFT',
                'conditions' => 'posts.topic_id = topics.id'
            ]
        ]);

包含可能な動作を使用してみましたが、次のクエリを使用して「カテゴリは投稿に関連付けられていません」というエラーが表示されます。

$query = $this->Categories->find('all')
        ->order(['Categories.name' => 'ASC'])
        ->contain(['Topics', 'Posts' => function($q){
            return $q->where(['Posts.topic_id' => 'Topics.id']);
        }]);
17
Wisd0m

@ndmからのアドバイスにより、私は望んだ結果を得ることができました。私はドキュメントのセクションを見落としたに違いないので、この問題を抱えている他の人は、ここでそれを行う方法です。

$query = $this->Categories->find('all')
        ->order(['Categories.name' => 'ASC'])
        ->contain([
            'Topics.Posts.Users'
        ]);
20
Wisd0m

Cakephp2のレガシーを見つけるだけで、古いバージョンのようにjoinを使用できます。

$result = $this->Category->findAll(fields=>['id','Topic.id'], 'conditions'=>['Topic.name'=>'s'],'join'=>['Topic' => [
            'table' => 'topics',
            'type' => 'INNER',
            'conditions' => 'Topic.category_id = Category.id'
        ]]);

おなじみですか?以前と同様にエイリアスを使用できます

初回の回答、コードエディターの動作がわからない、申し訳ありません。

3
sambo