Проблема с via

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Еугений
Сообщения: 163
Зарегистрирован: 2014.11.12, 16:00

Проблема с via

Сообщение Еугений »

Есть такой код:

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

public function getGroup()
    {
        return $this->hasOne(Groups::className(), ['id' => 'group_id'])
            ->via('groupsList');
    }
    
    public function getGroupsList()
    {
        return $this->hasOne(GroupsList::className(),['book_id'=>'id'])->limit(1);
    }
Проблема в том, что когда я обращаюсь $model->group->name, то, если в getGroupsList() ничего не найдено (то есть, модель не принадлежит никакой группе), то выполняются такие запросы
SELECT * FROM `groups_list` WHERE `book_id`=154 LIMIT 1 (с этим запросом все норм)
SELECT * FROM `groups` WHERE 0=1 такой запрос выполнятеся,если запрос сверху ничего не нашел. Если нашел, то запрос нормальный (SELECT * FROM `groups` WHERE id=6)

Как сделать, чтобы второй запрос не выполнялся, если via('groupsList') дал пустой результат?
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Проблема с via

Сообщение Евгений Емельянов »

Еугений писал(а):Как сделать, чтобы второй запрос не выполнялся, если via('groupsList') дал пустой результат?
Тут проблема не с via.
Если бы Вы организовали в БД целостность данных, такой вопрос и не возник бы.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Проблема с via

Сообщение zelenin »

Еугений писал(а):Есть такой код:

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

public function getGroup()
    {
        return $this->hasOne(Groups::className(), ['id' => 'group_id'])
            ->via('groupsList');
    }
    
    public function getGroupsList()
    {
        return $this->hasOne(GroupsList::className(),['book_id'=>'id'])->limit(1);
    } 
Проблема в том, что когда я обращаюсь $model->group->name, то, если в getGroupsList() ничего не найдено (то есть, модель не принадлежит никакой группе), то выполняются такие запросы
SELECT * FROM `groups_list` WHERE `book_id`=154 LIMIT 1 (с этим запросом все норм)
SELECT * FROM `groups` WHERE 0=1 такой запрос выполнятеся,если запрос сверху ничего не нашел. Если нашел, то запрос нормальный (SELECT * FROM `groups` WHERE id=6)

Как сделать, чтобы второй запрос не выполнялся, если via('groupsList') дал пустой результат?
никак
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Проблема с via

Сообщение zelenin »

Евгений Емельянов писал(а):
Еугений писал(а):Как сделать, чтобы второй запрос не выполнялся, если via('groupsList') дал пустой результат?
Тут проблема не с via.
Если бы Вы организовали в БД целостность данных, такой вопрос и не возник бы.
Тут проблема не с целостностью данных.
Если бы Вы вчитались в пост, такой коммент не возник бы.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Проблема с via

Сообщение Евгений Емельянов »

zelenin писал(а):
Евгений Емельянов писал(а):
Еугений писал(а):Как сделать, чтобы второй запрос не выполнялся, если via('groupsList') дал пустой результат?
Тут проблема не с via.
Если бы Вы организовали в БД целостность данных, такой вопрос и не возник бы.
Тут проблема не с целостностью данных.
Если бы Вы вчитались в пост, такой коммент не возник бы.
Похоже это Вы не вчитались в пост. А если бы вчитались и поняли, в чем проблема, то и Ваш ответ здесь бы не возник.
Хотя в последнем сомневаюсь, Ваши ответы возникают часто и без особого на то повода, ну т.е. там где точно можно было промолчать...
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Проблема с via

Сообщение SiZE »

Евгений Емельянов писал(а):Похоже это Вы не вчитались в пост.
В данном случае Зеленин прав. Причем тут целостность данных? Откуда вы знаете какая бизнес логика у автора и почему вы решили что обязательно должна быть запись в таблице?
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Проблема с via

Сообщение Евгений Емельянов »

SiZE писал(а):
Евгений Емельянов писал(а):Похоже это Вы не вчитались в пост.
В данном случае Зеленин прав. Причем тут целостность данных? Откуда вы знаете какая бизнес логика у автора и почему вы решили что обязательно должна быть запись в таблице?
Via обеспечивает связь между двумя таблицами. Промежуточная таблица связывает данные, которые существуют в связываемых таблицах. Если в одной из связываемых таблиц данных нет, то как образовалась связь в промежуточной таблице между данными, которые есть в одной таблице и нет в другой? По-моему, только если эти данные были удалены в одной из таблиц и в БД не производилась проверка на целостность данных (ну или были записаны вручную, тоже без проверки целостности).
Или я что-то не понимаю?
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Проблема с via

Сообщение SiZE »

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

Re: Проблема с via

Сообщение ElisDN »

Евгений Емельянов писал(а):Если в одной из связываемых таблиц данных нет, то как образовалась связь в промежуточной таблице между данными, которые есть в одной таблице и нет в другой?
Не придумывайте. Ничего не образовалось. Связи в промежуточной таблице groups_list нет и второй запрос groups идёт вхолостую.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Проблема с via

Сообщение Евгений Емельянов »

SiZE писал(а):
Евгений Емельянов писал(а):Via обеспечивает связь между двумя таблицами. Промежуточная таблица связывает данные, которые существуют в связываемых таблицах. Если в одной из связываемых таблиц данных нет, то как образовалась связь в промежуточной таблице между данными, которые есть в одной таблице и нет в другой?
Ок. Такой пример. Есть список тегов в одной таблице, есть пользователи в другой, есть промежуточная связывающая таблица. Надо достать все теги пользователя. Надо ли объяснять что промежуточная таблица может быть не заполнена?
убедили
Ответить