具有多个外键的CakePHP有序行为

具有多个外键的CakePHP有序行为,cakephp,behavior,Cakephp,Behavior,据我所知,CakePHP没有处理记录重新排序的内置机制。所以,我使用的是,据我所知,这是CakePHP中重新排序的实际行为。到目前为止,当我将它添加到各种模型中时,它工作得很好,但是,我有一种情况,我不知道如何处理 我的模型层次结构如下 章节>标题>类别>项目 但是,项目可以直接附加到节: 章节>项目 项模型的表同时定义了category_id和section_id,但实际上只有一个用于任何给定记录 在设置模型的$ACTSA时,有序行为有两个参数。以下是我的标题模型: var $actsAs =

据我所知,CakePHP没有处理记录重新排序的内置机制。所以,我使用的是,据我所知,这是CakePHP中重新排序的实际行为。到目前为止,当我将它添加到各种模型中时,它工作得很好,但是,我有一种情况,我不知道如何处理

我的模型层次结构如下

章节>标题>类别>项目

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

章节>项目

项模型的表同时定义了category_id和section_id,但实际上只有一个用于任何给定记录

在设置模型的$ACTSA时,有序行为有两个参数。以下是我的标题模型:

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

我应该如何为具有两个外键section\u id和category\u id的项目模型定义$actsAs成员,以确保正确维护排序/顺序?

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

我的模型没有通过$actsAs成员设置有序行为和外键。相反,在进行任何订单操作之前,我会确定父项类型,并在运行时使用适当的外键附加行为。

要获得答案,您可能需要添加一个输入示例和期望的输出示例。我不太明白你想创造什么样的效果。我不确定你所说的输入是什么意思。我所拥有的是一个模型,它可以是两个模型之一的子模型,并且有序行为基于外键维护给定模型组的排序,因此,附加到类别X的项目的排序独立于附加到类别Y的项目,a部分,B部分。这有助于澄清吗?这需要进行实质性的修改。我建议为小节项设置不可见的类别。@AlexanderMorland感谢您的建议,也感谢您为社区贡献了这段代码。在不必修改所有现有数据层次结构的情况下,我找到了一个似乎可行的解决方案。如果你认为它有什么问题,请告诉我,但到目前为止,它似乎在做我需要的事情。我想我看到的最大问题是,它违反了MVC模式,将应该是模型逻辑的东西放入控制器中。有人对如何将其构建到模型中有什么建议吗?