Salut tout le monde.

Je recontre un problème, je voudrai récupérer toutes les catégories, avec enfants, à partir d'un noeud avec un $query->find('path', ['for' => 1234]) (J'utilise le TreeBehavior.) seulement voilà, il me manque l'ID.

Comment puis-je récupérer la clé primaire (qui se situe chez moi dans Articles.category_id) et l'injecter dans l'option 'for' du find path dans un contain?

$articles = $query
    ->contain([
        'Categories' => function ($query) {
            return $query
                ->find('path', ['for' => 'Articles.category_id'])
                ->find('list')
            ; // Retourne une erreur car l'option for attend un véritable ID.
        },
    ])
;

++++
Si il y a quelqu'un qui peut contacter CakePHP et leur dire de modifier leurs méthodes utilisants l'option for (Dans le TreeBehavior) pour la remplacer par la clé primaire adéquate (ils peuvent la récupérer via la 'foreignKey' lors de la définition de l'association, je pense.) pour un contain, ça serait cool. :-)

Donc ce que je propose c'est celà:

  • Par enregistrement: (Par défaut.)

ex: $query->find('path', ['for' => 1234]);

  • Par foreignKey: (dans un contain.)

ex: $query->find('path', ['foreignKey' => 'Articles.category_id']);
ex: $query->find('path'); // Trouve tout seul comme un grand la foreignKey.
Pensez-vous que ce soit possible ;)?
++++

Merci.

4 réponses


Bonsoir.
C'est pourtant simple, soit l'id est passé en paramètre de l'url et il suffit d'injecter la variable dans la requête, ou alors, faire une requête pour récupérer l'ID de la catégorie de l'enregistrement correspondant à l'article.
Je ne vois pas où est le problème.

PhiSyX
Auteur

Hello, merci pour ta réponse @Lartak.
Non l'id n'est pas en paramètre dans l'url, il s'agit d'un listing d'articles. (tu ne peux pas le savoir donc je te pardonne. ^^)

Les ID's des catégories sont déjà présent(e?)s dans le tableau $articles.
Lorsque je fais un contain (belongsTo) sur $articles il me retourne bien la catégorie dont l'article a besoin mais j'aurai aimé qu'il retourne aussi les "papa"(parents) des catégories. J'aurai aimé aussi ne pas faire une requête supplémentaire :[

$articles = $query
    ->contain([
        'Categories' => function ($query) use ($tonID) {
            return $query
                ->find('path', ['for' => $tonID])
                ->find('list')
        },
    ])
;
PhiSyX
Auteur

Malheureusement je ne connais pas d'avance l'ID d'où ma proposition/mon poste.

Je suis obligé d'éxécuter la requête, parcourir le tableau $articles, pour récupérer l'id de la catégorie et de créer une nouvelle requete pour le find path… ça pourrait être plus "simplifié" x)