2

我正在为我的地址模型使用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]vs [Address][0][Address][id]

我不明白的是,如果提取的关联数据不使用自己的模型来查找数据,那有什么意义呢?这不是 MVC 的主要目的之一吗?

也许我只是不明白?或者我错过了什么?

有人可以启发我吗?

4

3 回答 3

4

你不能把这个条件放在你的协会里吗?

<?php

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

?>
于 2011-02-21T21:45:08.790 回答
0

就个人而言,我会为用户的查找查询添加一个条件

$this->Users->find->('all',array('conditions'=>array('Address.deleted !='=>'1')));

(尚未测试代码的确切语法,但这是一般想法)

于 2011-02-21T21:07:56.060 回答
0

当您使用 $this->User->find(...) 并包含地址时,您只会看到 User 模型的回调触发,因为那是您用来驱动查找的模型。

这就是为什么您必须在用户模型的关联中使用额外的条件来过滤掉软删除的地址。

如果在递归范围包括地址时,在用户模型上的每次查找期间都会触发地址模型的回调,那么您将无法控制何时包含软删除的地址,并且可能会在功能和这些回调的参数操作方面发生冲突。更不用说这可能产生的严重性能影响。

于 2011-02-22T13:42:11.677 回答