Bonjour à tous,

Je tente désespérement depuis plusieurs jours de faire quelque chose qui semble relativement simple selon la documentation de l'orm de CakePHP.

Ce que je fais

Mon but est de réaliser un système de menu. J'ai donc 2 tables : menus et menus_items.

Menu :

<?php
namespace Apps\Menu\Model;

use Apps\Menu\Model\Entities\MenuEntity;
use Cake\ORM\Table;

class MenusTable extends Table
{

    public function initialize(array $config)
    {
        $this->entityClass(MenuEntity::class);
        $this->hasMany('Items', [
            'className' => 'MenuItems'
        ]);
    }
}

MenuItems :

<?php

namespace Apps\Menu\Model;

use Apps\Menu\Model\Entities\MenuItemEntity;
use Cake\ORM\Table;

class MenuItemsTable extends Table
{
    public function initialize(array $config)
    {
        $this->entityClass(MenuItemEntity::class);
        $this->belongsTo('Menus');
        $this->hasMany('Children', [
            'className' => 'MenuItems',
            'foreignKey' => 'parent_id'
        ]);
    }
}

Comme vous pouvez le voir, les MenuItems hasMany MenuItems (avec l'alias Children).

Ce que je veux

Selon la documentation ici : Ce qui m'interesse c'est donc les associations imbriquées.

La doc :

$query = $articles->find()->contain([
    'Authors' => ['Addresses'], 'Comments' => ['Authors']
]);

Voulant récupérer tous les MenuItems avec leurs enfants j'ai essayé tout ça :

$menuItemsTable->find()
            ->where("menu_id = $id")
            ->contain(['Children']);

 $menuItemsTable->find()
           ->where("menu_id = $id")
           ->contain(['Children.Children']);

  $menuItemsTable->find()
           ->where("menu_id = $id")
           ->contain(['Children' => ['Children']);

  $menuItemsTable->find()
           ->where("menu_id = $id")
           ->contain(['Children' => ['MenuItems']);

Ce que j'obtiens

Dans tous les cas (sauf le premier) j'ai un message du genre : "Children is not associated with Children".

Dans le premier cas, j'ai un tableau avec TOUS les MenuItems avec 1 seul niveau Children:

Par exemple si j'ai Item 1 avec pour enfant Item 2 qui lui même A pour enfant Item 3 j'ai le tableau suivant.

[
          0 => [
              'item 1',
              'children' => [
                  0 => [
                   'item 2'
               ]
           ],
           1 => [
              'item 2',
              'children' => [
                  0 => [
                      'item 3'
                  ]
              ],
          ],
          2 => [
              'item 3'
          ]
 ]

Mais je voudrais :

[
            0 => [
                'item 1',
                'children' => [
                    0 => [
                        'item 2',
                        'children' => [
                            0 => [
                                'item 3'
                            ]
                        ]
                    ]
                ]
            ]
        ]

L'un d'entre vous aurait une idée de comment je peux m'y prendre ?
Merci de votre aide ;)

Aucune réponse