findBySQL и связанные модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
karpo518
Сообщения: 120
Зарегистрирован: 2012.08.30, 20:05
Контактная информация:

findBySQL и связанные модели

Сообщение karpo518 »

Есть модель Url с полями id,domain_id,content,created_at,has_problem,last_revision_id и модель Revision c полями id,url_id,content,contentLength,status,checked_at

При запросе с помощью findBySql модели вместе со связанной одноименные поля основной модели(id и content) перезаписываются данными связанной модели. Можно ли без изменения полей получить корректные данные для обоих моделей? Как указать, для какой модели предназначены данные столбца. Ниже запрос к модели

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


        $items = Url::findBySql('SELECT * FROM `url`
                                 LEFT JOIN `revision` ON `url`.`last_revision_id` = `revision`.`id`
                                 WHERE `revision`.`checked_at` < NOW()-INTERVAL '.$checkedHoursAgo.' SECOND AND `url`.`has_problem` = '.$hasProblem.'  
                                 ORDER BY `checked_at` DESC LIMIT '.$count)->with('lastRevision')->all();

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: findBySQL и связанные модели

Сообщение Onotole »

алиасы. Или кверибилдер
karpo518
Сообщения: 120
Зарегистрирован: 2012.08.30, 20:05
Контактная информация:

Re: findBySQL и связанные модели

Сообщение karpo518 »

Onotole вы говорите про алиасы полей в mysql-запросе? Поясните, какой нужно задать алиас, чтобы имя поля было уникальным, но фреймворк понял, куда закинуть значение.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: findBySQL и связанные модели

Сообщение Onotole »

Смотря что нужно выбирать. А вообще, зачем городить такой костыль и не воспользоваться средствами фреймворка?
karpo518
Сообщения: 120
Зарегистрирован: 2012.08.30, 20:05
Контактная информация:

Re: findBySQL и связанные модели

Сообщение karpo518 »

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

В интернете я не нашёл более серьезных примеров.

Не буду спрашивать, в чем заключается огород. Мне просто нужно быстрое решение моей проблемы. Ниже я приложил код, на котором будет проще указать на ошибку.

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


        $items = Url::findBySql('SELECT `u`.`id`,
                                        `u`.`domain_id`,
                                        `u`.`content`,
                                        `u`.`created_at`,
                                        `u`.`has_problem`,
                                        `u`.`last_revision_id`,
                                        `r`.`id`,
                                        `r`.`url_id`,
                                        `r`.`content`,
                                        `r`.`contentLength`,
                                        `r`.`status`,
                                        `r`.`checked_at` 
                                FROM `url` AS `u`
                                LEFT JOIN `revision` AS `r` ON `u`.`last_revision_id` = `r`.`id`
                                WHERE `r`.`checked_at` < NOW()-INTERVAL '.$checkedHoursAgo.' SECOND AND `u`.`has_problem` = '.$hasProblem.'  
                                ORDER BY `checked_at` DESC LIMIT '.$count)->with('lastRevision')->all();
        return $items;

    } 
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: findBySQL и связанные модели

Сообщение ElisDN »

karpo518 писал(а):

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

`u`.`id`
`r`.`id`
Вот здесь id и перезаписывается, так как из SELECT псевдонимы таблиц не возвращаются. Так что оставляйте только поля главной таблицы:

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

SELECT `u`.* FROM `url` AS `u`
karpo518
Сообщения: 120
Зарегистрирован: 2012.08.30, 20:05
Контактная информация:

Re: findBySQL и связанные модели

Сообщение karpo518 »

Вот здесь id и перезаписывается
Это я понимаю.
Так что оставляйте только поля главной таблицы
В этом случае связанные модели будут загружаться не сразу,а только при запросе к ним? Если так, то этот вариант не подходит.
Поясните, пожалуйста, подробнее.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: findBySQL и связанные модели

Сообщение ElisDN »

Они и так будут подгружаться отдельным запросом, так как viewtopic.php?t=31426.
karpo518
Сообщения: 120
Зарегистрирован: 2012.08.30, 20:05
Контактная информация:

Re: findBySQL и связанные модели

Сообщение karpo518 »

Сколько будет всего запросов? 2?
Ответить