Поведение и связи

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Поведение и связи

Сообщение Антон Смирнов »

Столкнулся с интересной штукой, которую не понятно, как сделать в Yii2.
Есть модели: страницы, посты, комментарии. К каждой привязаны файлы, выношу в поведевение, которое затем подключаю в ActiveRecord. Код из поведения:

Код: Выделить всё

    public function getFiles()
    {
        return $this->owner->hasMany(File::className(), ['type_id' => 'id']);
    }
И в этом же поведении после удаления модели хочу удалить все ее файлы:

Код: Выделить всё

    public function afterDelete()
    {
        foreach ($this->files as $file) {
            $file->delete();
        }
    } 
но проблема в том, что метод $this->files возвращает не массив моделей файлов, а объект ActiveQuery.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Поведение и связи

Сообщение vitalik1183 »

$this->owner->files если речь про поведение
Yii2!
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Re: Поведение и связи

Сообщение Антон Смирнов »

vitalik1183 писал(а):$this->owner->files если речь про поведение
Вы не поняли. У меня > 10 моделей с одинаковым кодом

Код: Выделить всё

public function getFiles()
    {
        return $this->hasMany(File::className(), ['type_id' => 'id']);
    } 
я выношу это в поведение:

Код: Выделить всё

public function getFiles()
    {
        return $this->owner->hasMany(File::className(), ['type_id' => 'id']);
    } 
и теперь я не могу вызвать $myModel->files потому, что этот метод теперь возвращает ActiveQuery, а не массив моделей файлов.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Поведение и связи

Сообщение vitalik1183 »

что то я непойму, у вас связь в поведении брошена, а удаление вы в модели вызываете или чего? чем ActiveRecord::EVENT_BEFORE_DELETE не устривает в поведении?
Yii2!
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Re: Поведение и связи

Сообщение Антон Смирнов »

vitalik1183 писал(а):что то я непойму, у вас связь в поведении брошена, а удаление вы в модели вызываете или чего? чем ActiveRecord::EVENT_BEFORE_DELETE не устривает в поведении?

Код: Выделить всё

public function getFiles()
    {
        return $this->hasMany(File::className(), ['type_id' => 'id']);
    }  
Такой есть более в 10 моделях. Как не дублировать код? Что предложите?
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Поведение и связи

Сообщение vitalik1183 »

вы в поведение его вынесли, где вы вызываете гетер?
Yii2!
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Поведение и связи

Сообщение mickgeek »

http://www.yiiframework.com/doc-2.0/gui ... ional-data (см. последнее примечание). Видимо, поведение не даёт провернуть такой трюк, надо почитать исходный код. Лучше напишите трейт.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Re: Поведение и связи

Сообщение Антон Смирнов »

Я вызываю геттер и в самом поведении:
$this->files
получаю ActiveQuery. При таком коде это ожидаемо. Получается, что в данном решении мне следует использовать или наследование или трейты, чтобы не дублировать код, поведения применить не получается.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Поведение и связи

Сообщение mickgeek »

Ну теперь понятно, геттер ожидает экземпляр ActiveRecord, а не поведения, поэтому из второго и не стоит ожидать чуда.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Поведение и связи

Сообщение ElisDN »

Код: Выделить всё

$this->files->all() 
Ответить