0

我希望自动更新/删除连接表。我在 saveAll() 之前执行 deleteAll() 作为解决方法。

当我提交表单时,布局和组件模型会正确更新,但布局组件模型(即连接表)会插入新数据(这是我想要的),但不会删除引用的数据。

布局模型:

class Layout extends AppModel {
    var $name = 'Layout';

    var $hasMany = array(
        'LayoutComponentOrder' => array(
            'className' => 'LayoutComponentOrder',
            'foreignKey' => 'layout_id',
            'dependent' => false,
            'order' => 'LayoutComponentOrder.sort_id ASC',
        ),
        'ComponentVideo' => array(
            'className' => 'ComponentVideo',
            'foreignKey' => 'layout_id',
            'dependent' => false,
        ),
);}

组件型号:

class ComponentVideo extends AppModel {
    var $name = 'ComponentVideo';
    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $hasMany = array(
        'LayoutComponentOrder' => array(
            'className' => 'LayoutComponentOrder',
            'foreignKey' => 'layout_component_id',
            'dependent' => false,
        ),
    );

    var $belongsTo = array(
        'Layout' => array(
            'className'    => 'Layout',
            'foreignKey'    => 'layout_id'
        ),
    );
};

布局组件模型(连接表):

class LayoutComponentOrder extends AppModel {
    var $name = 'LayoutComponentOrder';
    var $uses = 'layout_component_orders'; 

    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $belongsTo = array(
            'Layout' => array(
                'className'    => 'Layout',
                'foreignKey'    => 'layout_id'
            ),
            'ComponentVideo' => array(
                'className'    => 'ComponentVideo',
                'foreignKey'    => 'layout_component_id'
            )
        );
}

布局控制器:

// deleting the data manually
$this->LayoutComponentOrder->deleteAll(array('LayoutComponentOrder.layout_id' => $layout_id));
// this one inserts into the tables including the join table        
$this->Layout->id = $layout_id;
if ($this->Layout->saveAll($this->data)) {
   $this->Session->setFlash(__('The layout has been saved', true));
}

如何自动删除加入?CakePHP 可以做到这一点吗?

4

2 回答 2

1

不幸的是,对于 hasMany 关系,这并没有内置到 CakePHP 的 saveAll 中。我希望是这样,因为我发现此页面正在寻找相同问题的解决方案。

不过,它似乎是内置于 HABTM 关系中的。

请参阅有没有办法让 saveAll() 删除无关的对象?并且不应该 saveAll 也删除关联的记录吗?)

您必须实现自己的解决方案(如果表单验证,我的快速解决方案会在 saveAll 之前运行 deleteAll。但这并不理想,因为如果出现与表单验证无关的错误,您将丢失现有的关联项目)。

于 2011-04-14T23:38:09.700 回答
0

也许我不明白这个问题,但我们是在谈论从 Cake 中删除父记录时删除联接吗?如果使用 'dependent' 参数在模型关系中进行配置,它会这样做:

dependent:当依赖键设置为true,调用模型的delete()方法,级联参数设置为true时,关联的模型记录也被删除。在这种情况下,我们将其设置为 true,以便删除用户也会删除她关联的个人资料。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

那是你要找的吗?

于 2014-04-18T02:45:53.010 回答