Удаленные данные CakePHP все еще отображаются в модельных ассоциациях - PullRequest
2 голосов
/ 22 февраля 2011

Я использую 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 и возвращает правильные данные.

(Конечно, в другом формате [Address][0][id] против [Address][0][Address][id])

Что я не понимаю, так это то, что если связанные данные, которые были получены, не используют свою собственную модель для поиска своих данных, тогда какой смысл? Разве это не одна из главных целей MVC?

Может, я просто не понимаю? Или я что-то упустил?

Может кто-нибудь просветить меня?

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

Не можете ли вы поставить это условие в вашей ассоциации?

<?php

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

?>
0 голосов
/ 22 февраля 2011

Когда вы используете $ this-> User-> find (...) и включаете адреса, вы увидите только срабатывание обратных вызовов модели пользователя, потому что именно эту модель вы используете для поиска.

Вот почему вы должны использовать дополнительные условия в ассоциациях вашей пользовательской модели, чтобы отфильтровать мягко удаленные адреса.

Если бы обратные вызовы модели адресов выполнялись во время каждой находки в модели пользователя, когда в область рекурсии были включены адреса, у вас не было бы никакого контроля над тем, когда включать мягко удаленные адреса, и это могло бы привести к конфликтам в функциональности и манипуляции параметрами обратные вызовы. Не говоря уже о серьезном влиянии на производительность, которое это может оказать.

0 голосов
/ 22 февраля 2011

Лично я бы добавил условие в запрос поиска для пользователей

$ this-> Users-> find -> ('all', array ('условие' => array ('Address.deleted)! = '=>' 1 ')));

(не проверял код на предмет точного синтаксиса, но это общая идея)

...