web-dev-qa-db-fra.com

Comment joindre plusieurs tables en utilisant CakePHP 3?

J'utilise CakePHP 3.x.

Ce que je veux, c'est pouvoir appeler $ this-> Categories-> find () puis rejoindre Topics on Topics.cat_id = Categories.id puis rejoindre Posts on Posts.topic_id = Topics.id.

Je ne reçois aucune erreur, mais les seules données que je récupère sont les données des catégories, j'ai essayé de joindre LEFT et INNER sans succès. Toute aide serait grandement appréciée.

Les relations de table sont les suivantes:

CatégoriesTable

$this->hasMany('Topics');

SujetsTable

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

PostsTable

$this->belongsTo('Topics');

Aussi la requête que j'ai:

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

J'ai essayé d'utiliser le comportement contenable, mais maintenant j'obtiens l'erreur "Les catégories ne sont pas associées aux messages" en utilisant cette requête:

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

Avec les conseils donnés par @ndm, j'ai pu obtenir le résultat que je voulais. J'ai dû ignorer la section dans les documents, donc toute autre personne ayant ce problème, voici comment le faire.

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

Il suffit de trouver le type d'héritage de cakephp2, vous pouvez toujours utiliser join comme l'ancienne version.

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

Trouver familier? vous pouvez toujours utiliser l'alias comme avant

Première réponse, je ne sais pas comment l'éditeur de code fonctionne, désolé.

3
sambo