ActiveRecord и LEFT JOIN

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

ActiveRecord и LEFT JOIN

Сообщение AlikDex »

В модели AR есть метод с таким поиском.

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

        $posts =  Posts::find()
                    ->select("*")
                    ->leftJoin('post_meta', 'post_meta.post_id = post.id')
                    ->active()
                    ->limit(5)
                    ->orderBy(['date' => SORT_DESC])
                    ->all();
Проблема в том, что дополнительные поля со второй таблицы не записываются в свойства объекта. (я новичек в yii)
Вопрос, как сделать чтоб записывались?

Если я правильно понял, то объявление связей таблиц типа HAS_MANY и HAS_ONE подразумевает дополнительный запрос в связываемую таблицу. Это не наш путь. использование joinWith я так понял это что-то типа SELECT * FROM table_a, table_b. Это тоже не наш путь. Отказаться от AR и делать через Query? или есть еще вариант?

Спасибо.

П.С.
Поправьте где был не прав.
Последний раз редактировалось AlikDex 2015.09.01, 14:35, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

запрос заполняет ar-модель. Если в ней нет каких-то атрибутов, то они и не заполнятся. От этого и пляшите.
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

zelenin писал(а):запрос заполняет ar-модель. Если в ней нет каких-то атрибутов, то они и не заполнятся. От этого и пляшите.
И где их добавлять, эти свойства? Вот так не работает. Т.е. объект все равно поулчается со своими свойствами = полям с таблицы.

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

    public function attributeLabels()
    {
        return [
            'id' => Yii::t('locale/posts', 'ID'),
            'autor' => Yii::t('locale/posts', 'Autor'),
            'date' => Yii::t('locale/posts', 'Date'),
            'short_story' => Yii::t('locale/posts', 'Short Story'),
            'full_story' => Yii::t('locale/posts', 'Full Story'),
            'xfields' => Yii::t('locale/posts', 'Xfields'),
            'title' => Yii::t('locale/posts', 'Title'),
            'descr' => Yii::t('locale/posts', 'Descr'),
            'keywords' => Yii::t('locale/posts', 'Keywords'),
            'category' => Yii::t('locale/posts', 'Category'),
            'alt_name' => Yii::t('locale/posts', 'Alt Name'),
            'comm_num' => Yii::t('locale/posts', 'Comm Num'),
            'allow_comm' => Yii::t('locale/posts', 'Allow Comm'),
            'allow_main' => Yii::t('locale/posts', 'Allow Main'),
            'approve' => Yii::t('locale/posts', 'Approve'),
            'fixed' => Yii::t('locale/posts', 'Fixed'),
            'allow_br' => Yii::t('locale/posts', 'Allow Br'),
            'symbol' => Yii::t('locale/posts', 'Symbol'),
            'metatitle' => Yii::t('locale/posts', 'Metatitle'),
            'flag' => Yii::t('locale/posts', 'Flag'),
            // addiditional field
            'likes' => "Likes",
            'dislikes' => "Dislikes",
        ];
    }
 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

AlikDex писал(а):
zelenin писал(а):запрос заполняет ar-модель. Если в ней нет каких-то атрибутов, то они и не заполнятся. От этого и пляшите.
И где их добавлять, эти свойства?
в качестве атрибутов класса
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

разобрался, спасибо.
А вообще AR стоит использовать или нет? Пишут он тормозной. Вопрос - на сколько?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord и LEFT JOIN

Сообщение ElisDN »

AlikDex писал(а):Пишут он тормозной. Вопрос - на сколько?
Вот кто пишет, что тормозной, те пусть бенчмарки и выкладывают.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

ElisDN писал(а):
AlikDex писал(а):Пишут он тормозной. Вопрос - на сколько?
Вот кто пишет, что тормозной, те пусть бенчмарки и выкладывают.
не тормозной, а жрет много памяти (конечно речь идет о большом кол-ве моделей)
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

Ииии как мне засунуть этот AR объект в ListView?? Лист вив просит AQ, а для AR виджетов нет нифига. Через форич выводить или как вообще? Ааа у меня баттхерт!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

AlikDex писал(а):Лист вив
зачем на ровном месте искажать название.
AlikDex писал(а):просит AQ
ложь. https://github.com/yiisoft/yii2/blob/ma ... ew.php#L36
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

если это ложь, тогда это что?
The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

AlikDex писал(а):если это ложь, тогда это что?
The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.
это текст исключения
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

именно. AR -> ActiveDataProvider -> ListView = исключение. Не принимает объект AR. Шо делать то?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

AlikDex писал(а):именно. AR -> ActiveDataProvider -> ListView = исключение. Не принимает объект AR. Шо делать то?
я вам скинул кусок кода - виджет просит провайдер, а не модель.
AlikDex
Сообщения: 20
Зарегистрирован: 2015.07.28, 18:07

Re: ActiveRecord и LEFT JOIN

Сообщение AlikDex »

точно. ActiveDataProvider не принимает объект ActiveRecord! Другой использовать? Какой?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord и LEFT JOIN

Сообщение zelenin »

AlikDex писал(а):ActiveDataProvider не принимает объект ActiveRecord!
я не понимаю вас.
AlikDex писал(а):Другой использовать? Какой?
у вас огромный выбор провайдеров?
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: ActiveRecord и LEFT JOIN

Сообщение mkramer »

AlikDex писал(а):точно. ActiveDataProvider не принимает объект ActiveRecord! Другой использовать? Какой?
Да, не принимает. Поэтому пользуются методами, которые возвращают ActiveQuery, например так:

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

$postProvider = new ActiveDataProvider(["query" => Post::find()->where(["published" => 1])]);
Ответить