У меня есть таблица в моей БД, которая имеет связь с самим собой. Я пытаюсь получить все родительские категории с их дочерними категориями, но я не могу заставить его работать.
Вот как выглядит таблица:
id | name | description | image | is_child | forum_category_id | level
Теперь, очевидно, «forum_category_id» является родительским идентификатором, который ссылается на одну и ту же таблицу.
Я испекла модель, и это находится в файле таблицы:
$this->belongsTo('ForumCategories', [ 'foreignKey' => 'forum_category_id' ]); $this->hasMany('ForumCategories', [ 'foreignKey' => 'forum_category_id' ]);
Код, который я использую для загрузки из БД, следующий:
debug($results = $this->find() ->order(['id' => 'ASC']) ->where(['is_child' => 0]) ->toArray() );
С помощью этого кода я получаю родительские категории, но не дети. Поэтому я решил использовать «Contain», но возвращает только родительские категории.
debug($results = $this->find() ->order(['id' => 'ASC']) ->where(['is_child' => 0]) ->contain([ 'ForumCategories' => function ($q) { return $q ->where(['is_child' => 1]); } ]) ->toArray() );
Я понятия не имею, как получить дочерние категории. Я прочитал что-то об использовании «Threaded» (пока нет результатов / успехов) или TreeBehaviour, но я действительно не знаю, как их использовать.
Любая идея о том, как это все еще возможно, очень ценится!
Вы должны использовать разные псевдонимы для ассоциации 2.
$this->belongsTo('ForumCategories', [ 'foreignKey' => 'forum_category_id' ]); $this->hasMany('ForumChildCategories', [ 'className' => 'ForumCategories', 'foreignKey' => 'forum_category_id' ]);
К этому $this->ForumCategories->find()
вы получите родительский и $this->ForumChilfCategories->find()
детей.
В противном случае – если это опция – измените схему базы данных и используйте поведение дерева.