Как присоединиться к нескольким таблицам с помощью CakePHP 3?

Я использую CakePHP 3.x.

Я хочу, чтобы иметь возможность вызывать $this- > Categories- > find(), а затем присоединяться к темам topic.cat_id = Categories.id, а затем присоединяться к сообщениям Posts.topic_id = Topics.id.

Я не получаю никаких ошибок, но единственные данные, которые я получаю, это данные категорий, я пробовал присоединиться к ЛЕВЫМ и ВНУТРЕННЕЕ соединение без успеха. Любая помощь будет принята с благодарностью.

Отношение таблицы:

CategoriesTable

$this->hasMany('Topics');

TopicsTable

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

Ответы

Ответ 1

С советом @ndm дал, я смог получить результат, который я хотел. Я, должно быть, не обратил внимания на раздел в документах, поэтому у кого-либо еще есть эта проблема, вот как это сделать.

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

Ответ 2

Просто найдите вид наследия 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

Попробуйте следующее:

 $query = $this->Categories->find('all')
        ->fields('Categories.*', 'Topics.*', 'Posts.*')
        ->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'
            ]
        ]);

Добавьте эту строку:

->fields('Categories.*', 'Topics.*', 'Posts.*')

для получения данных из тем и сообщений