CakePHP软删除的数据仍然显示在模型关联中

我使用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)));
然后它确实在Address模型上使用beforeFind过滤器并返回正确的数据。 (当然以不同的格式
[Address][0][id]
[Address][0][Address][id]
) 我不明白的是,如果拉出的相关数据没有使用自己的模型来查找数据,那么重点是什么?这不是MVC的主要目的之一吗? 也许我只是不明白?或者我错过了什么? 有人可以赐教吗?     
已邀请:
你不能把这个条件放在你的协会吗?
<?php

class User extends AppModel {
    var $hasMany = array(
        'Address' => array(
            'conditions' => array('NOT' => array('Address.deleted' => '1')),
        )
    );
}

?>
    
就个人而言,我会为用户的查询添加一个条件 $ this-> Users-> find - >('all',array('conditions'=> array('Address.deleted!='=>'1'))); (尚未测试代码的确切语法,但这是一般的想法)     
当您使用$ this-> User-> find(...)并包含地址时,您将只看到用户模型的回调触发,因为这是您用来驱动查找的模型。 这就是为什么您必须在User模型的关联中使用额外条件来过滤掉软删除的地址。 如果在递归范围包含地址时在User模型上的每次查找期间触发了Address模型的回调,则无法控制何时包含软删除的地址,并且会冒这些回调的功能和参数操作冲突的风险。更不用说这可能带来严重的性能影响。     

要回复问题请先登录注册