andy_s писал(а):
Тут, как говорится, "овчинка не стоит выделки". Проще воспользоваться методом явно, чем городить совсем неочевидные зависимости (которых может вовсе не быть) между сменой первичного ключа и загрузкой связанных объектов.
Почему первичного ключа? Первичный ключ модельки основной не меняем какраз. Понятное дело что смена основного идишника подразумевает другой объект совершенно и его именно надо пересоздать по find или иначе. Я говорю какраз о смене именно атрибута одного и того же объекта. Мало того - ничего делать то собственно и не нужно, как я вижу, отношения кешируются в массив _relations, но unsetAttributes к примеру, это обычный
foreach () $attr = null;. Почему бы не сделать там же $this-> _relations=array(); ?
Код: Выделить всё
abstract class CActiveRecord extends CModel
{
...
private $_related=array(); // attribute name => related objects
....
....
public function __unset($name)
{
...
unset($this->_related[$name]); // Но вот тут-то к примеру, спокойно делается unset?
}
public function unsetAttributes($names=null)
{
if($names===null)
$names=$this->attributeNames();
foreach($names as $name)
$this->$name=null;
// почему бы здесь не сделать вот так? Таким образом не будет "залипать" кеш
$this-> _related = array();
}
}
тоже самое как мне кажется хорошо сделать в setAttributes а также в __set делать просто unset кеша связи изменяемого атрибута если он участвует в связи. ( uid -> unset ($this-> _related[user]), post_id -> unset ($this-> _related[post]) итд ).
Почему мне кажется что это важно? Приведу пример
Код: Выделить всё
// допустим мы сохраняем новый пост
$model = new Post(); // создаем новый пост
$model-> attributes = $_POST['post']; // присваиваем атрибуты
$model-> save(); // сохранили
$model-> user-> sendNotification("Пост сохранен"); // просто что-то делаем с притянутым за uid пользователем, который автор поста
// и тут я захотел создать точно такой же пост одновременно от другого пользователя.
// Что, мне повторять весь предыдущий код? Проще кажется просто поменять uid
$model-> uid = ADMIN_USER_ID; // не важно, просто от имени другого юзера
$model-> save(); // Ага, все сохранили
$model-> user-> sendNotification("Пост-перепост!"); // Я логично предполагаю что ф-я вызовется для ADMIN_USER_ID, но вот облом - она вызывается для старого пользователя, не взирая на то, что он уже давно не тот
// получается что каждый раз надо делать
$model-> getRelated('user', false)-> sendNotification("xxxx"); // мелочь, а неприятно и не очевидно!
// или же явным образом сбрасывать кеш, тогда сразу резко $model-> user становится тем, кем надо
unset($model-> user);