我使用SoftDeletableBehavior作为我的地址模型。
这样设置当你删除一个地址时它并没有真正删除它,而是将数据库中的deleted
列设置为1。
这也会更改您在地址模型的beforeFind
函数中的查询,以仅提取deleted != 1
当我通过/addresses/show/43
等地址控制器查看地址时,此功能正常。
但是我的Users
控制器hasMany
地址。因此,当我在用户控制器中并且我呼叫$this->find('first');
为了获得用户,我也获得了相关的地址。我希望这不会给我(轻柔)删除的地址但它确实如此。地址模型上的beforeFilter也不会被调用。
处理此问题的正确方法是什么?
显然当我这样做时:
$data = $this->User->find('first',array('conditions' => array('User.id' => $id),'recursive' => 2));
我有一个$data['User]
数组和一个$data['Address]
数组(以及其他数组)。
但是这不使用地址模型中的beforeFind过滤器。所以我得到了错误的数据。
但如果我这样做:
$data = $this->User->find('first',array('conditions' => array('User.id' => $id),'recursive' => 2));
$data['Address'] = $this->User->Address->find('all',array('conditions'=>array('user_id'=>$id)));
然后 使用地址模型上的beforeFind过滤器并返回正确的数据。
(当然采用不同的格式[Address][0][id]
vs [Address][0][Address][id]
)
我不明白的是,如果拉出的关联数据没有使用自己的模型来查找数据,那么重点是什么?这不是MVC的主要目的之一吗?
也许我只是不明白?或者我错过了什么?
有人可以赐教我吗?
答案 0 :(得分:4)
你不能把这个条件放在你的协会吗?
<?php
class User extends AppModel {
var $hasMany = array(
'Address' => array(
'conditions' => array('NOT' => array('Address.deleted' => '1')),
)
);
}
?>
答案 1 :(得分:0)
就个人而言,我会为用户的查询查询添加一个条件
$ this-&gt; Users-&gt; find-&gt;('all',array('conditions'=&gt; array('Address.deleted!='=&gt;'1')));
(尚未测试代码的确切语法,但这是一般的想法)
答案 2 :(得分:0)
当您使用$ this-&gt; User-&gt; find(...)并包含地址时,您只会看到用户模型的回调触发,因为这是您用来驱动查找的模型。
这就是为什么你必须在用户模型的关联中使用额外的条件来过滤掉软删除的地址。
如果在递归范围包含地址的情况下在User模型的每次查找期间触发了地址模型的回调,则无法控制何时包含软删除的地址,并且会冒险在功能和参数操作方面发生冲突回调。更不用说这可能带来严重的性能影响。