Как реализовать модель собственных ссылок (parent_id) в cakephp - PullRequest
8 голосов
/ 10 ноября 2011

У меня есть таблица под названием категории.Таблица содержит категории и их под-подкатегории ...

Это простая таблица:

  • id
  • parent_id
  • title

Таким образом, я могу создавать категории с бесконечной глубиной ... Я надеялся, что cakephp поймет parent_id (я также пробовал category_id, но это заставляет cakePHP присоединяться к себе: D)

Как правильно решить эту проблему?

ПРИМЕЧАНИЕ. Существует также таблица «многие ко многим», называемая местами.Эти места могут принадлежать к одной или нескольким категориям.

Ответы [ 5 ]

20 голосов
/ 11 ноября 2011

Поведение дерева в этой ситуации излишне. Вам просто нужно настроить свою модель так:

class Category extends AppModel {

  public $hasMany = array(
    'Children'=>array(
       'className'=>'Category',
       'foreignKey'=>'parent_id'
    )
  );

  public $belongsTo = array(
    'Parent'=>array(
       'className'=>'Category',
       'foreignKey'=>'parent_id'
    )
  );

}

Теперь, когда вы выполните find () для Category, вы получите две дополнительные модели: Parent (который указывает на идентификатор родителя) и Children (который перечисляет его детей).

5 голосов
/ 10 ноября 2011

Посмотрите на поведение дерева ;с логикой MPTT.Ссылка на сайт Oracle устарела;но вы можете найти кучу материала о том, как его использовать, в руководстве по тортам и онлайн .

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    parent_id INTEGER(10) DEFAULT NULL,
    lft INTEGER(10) DEFAULT NULL,
    rght INTEGER(10) DEFAULT NULL,
    name VARCHAR(255) DEFAULT '',
    PRIMARY KEY  (id)
);

Просто убедитесь, что ваша таблица соответствует этой структурелучшие результаты в Cake и выпечки.

2 голосов
/ 10 ноября 2011

В модели Категория: принадлежит родительскому элементу и имеет много дочерних элементов, оба имеют класс «Категория» и внешний ключ «parent_id»

1 голос
/ 02 мая 2016

у меня custom recursive function tree() работает

public function index() {
    $c = $this->tree();
    debug($c);
    exit;
}


function tree($parent=null){
    $arr  = array();
    $categories = $this->Category->find('all',array(
         'conditions'=>array('Category.parent_id '=> $parent)
    ));
    foreach($categories as $key => $category){           
        $arr[$category['Category']['id']]['title'] = $category['Category']['name'];             
        $arr[$category["Category"]["id"]]['children'] = $this->tree($category['Category']['id'] );
    }
    return $arr;
} 
0 голосов
/ 06 октября 2014

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

Я предполагаю использовать это в сценариях, где с таблицей Product связан один идентификатор категории, связанный с ней, но при отображении пользователям я также хотел бы отобразитьвсю родительскую цепочку, чтобы они могли видеть что-то вроде «кондитерские изделия / сезонный / пестрый» - и тогда пользователь может изменить всю иерархию продуктов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...