CakePHP упорядоченное поведение с несколькими внешними ключами - PullRequest
0 голосов
/ 03 декабря 2011

CakePHP не имеет встроенного механизма для обработки переупорядочения записей, насколько я знаю.Итак, я использую Упорядоченное поведение , которое, насколько я могу судить, является поведением по умолчанию для переупорядочения в CakePHP.Пока он работает хорошо, когда я добавляю его в различные модели, однако у меня возникла ситуация, с которой я не уверен, как справиться.

Моя иерархия моделей следующая.

Section > Heading > Category > Item

Тем не менее, Предметы могут быть прикреплены непосредственно к секциям:

Section > Item

В таблице модели Товара определены как category_id, так и section_id, хотятолько один фактически используется для любой данной записи.

Упорядоченное поведение имеет два параметра, установленных при установке $actsAs модели.Вот пример для моей модели заголовка:

var $actsAs = array('Ordered' => array('field' => 'order','foreign_key' => 'section_id'));

Как определить элемент $actsAs для модели элемента, в котором есть два внешних ключа section_id и category_id, чтобы обеспечить порядок / последовательностьправильно поддерживается?

1 Ответ

0 голосов
/ 07 декабря 2011

Я не тестировал это подробно, но с моей первой попытки это, кажется, обходной путь, который позволит мне динамически управлять заказом. Внутри моего ItemsController у меня есть следующие действия:

    function moveup($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Invalid id for Item', true));
        } else {
            $item = $this->Item->read(null, $id);

            if ($item['Item']['section_id'] != 0) {
                $this->Item->Behaviors->attach('Ordered', array('field' => 'order', 'foreign_key'=>'section_id'));
            } else {
                $this->Item->Behaviors->attach('Ordered', array('field' => 'order', 'foreign_key'=>'category_id'));
            }

            if ($this->Item->moveup($id)) {
                $this->Session->setFlash(__('Item moved up', true));
            } else {
                $this->Session->setFlash(__('Item move failed', true));
            }
        }

        $this->redirect($this->referer());
    }

    function movedown($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Invalid id for Item', true));
        } else {
            $item = $this->Item->read(null, $id);

            if ($item['Item']['section_id'] != 0) {
                $this->Item->Behaviors->attach('Ordered', array('field' => 'order', 'foreign_key'=>'section_id'));
            } else {
                $this->Item->Behaviors->attach('Ordered', array('field' => 'order', 'foreign_key'=>'category_id'));
            }

            if ($this->Item->movedown($id)) {
                $this->Session->setFlash(__('Item moved down', true));
            } else {
                $this->Session->setFlash(__('Item move failed', true));
            }
        }

        $this->redirect($this->referer());
    }

Моя модель не устанавливает упорядоченное поведение (и, следовательно, foreign_key) через член $actsAs. Вместо этого перед любой манипуляцией с заказом я определяю тип родительского элемента и присоединяю поведение с соответствующим foreign_key во время выполнения.

...