如何使用CakePHP 3连接多个表?

2022-08-30 23:29:24

我正在使用CakePHP 3.x。

我想要的是能够调用$this->Categories->find(),然后加入 Topics on Topics.cat_id = Categories.id 然后加入 posts on Posts.topic_id = Topics.id。

我没有收到任何错误,但我得到的唯一数据是类别数据,我已经尝试了左加入和内部连接,但没有成功。任何帮助将不胜感激。

表关系包括:

分类表

$this->hasMany('Topics');

主题表

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

帖子表

$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']);
        }]);

答案 1

有了@ndm的建议,我能够得到我想要的结果。我一定忽略了文档中的部分,所以其他任何人都有这个问题,这是如何做到的。

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

答案 2

只要找到cakephp2的那种遗产,你仍然可以像旧版本一样使用joil。

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

发现熟悉吗?您仍然可以像以前一样使用别名

第一次回答,不知道代码编辑器是如何工作的,对不起。


推荐