CakePHP使用多个外键命令行为

时间:2011-12-02 20:09:33

标签: cakephp behavior

据我所知,CakePHP没有用于处理记录重新排序的内置机制。所以,我正在使用Ordered Behavior,就像我所知道的那样,是在CakePHP中重新排序的事实行为。到目前为止,当我将它添加到各种模型时,它运行良好,但是,我遇到了一个我不确定如何处理的情况。

我的模型层次结构如下。

Section > Heading > Category > Item

但是,项目可以直接附加到部分:

Section > Item

Item模型的表定义了category_idsection_id,但实际上只有一个用于任何给定的记录。

在设置模型$actsAs时,有序行为设置了两个参数。这是我的标题模型的一个:

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

如何为Item模型定义$actsAs成员,其中有两个外键section_idcategory_id,以确保正确维护排序/序列?

1 个答案:

答案 0 :(得分:0)

我没有对此进行过广泛的测试,但是在第一次尝试时,这似乎是一种可以让我动态管理排序的解决方法。在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附加行为。