Задать вопрос
@Korvin3

GridView Yii2: как получить все записи, даже если поле не указано?

Есть таблицы user(id, name), property(id, name) и user_property(id, user_id, property_id, value). В таблице user_property хранятся свойства пользователей. Если свойство property.id=1 присуще пользователю user.id=1, то в таблице user_property будет запись (user_id=1, property=1, value=*какое-то значение*). Если свойство не присуще пользователю, то записи о нём не будет в таблице user_property вообще. Думаю, есть такой паттерн со своим названием, буду благодарен, если кто-то подскажет. В модели User есть связь для каждого property, в модели поиска я подтягиваю свойства с помощью $query->joinWith('propertyName propertyName') и потом $query->andFilterWhere(['like', 'propertyName.value, $this->propertyNameValue]). В gridView перечислены атрибуты, которые я хочу выводить. Все выводится, сортируется, работает поиск, но, если одно из свойств, перечисленных в gridView не присуще данному User, то он не отобразится, даже если не было указано сортировки/поиска по этому свойству. Как это исправить?

В SQL получается так:
SELECT COUNT(*) FROM `user` LEFT JOIN `user_property` `propertyName` ON `user`.`id` = `propertyName`.`user_id` WHERE `propertyName`.`property_id`=1;
SELECT * FROM `user_property` `propertyName` WHERE (`propertyName`.`marker_id`=1) AND (`user_id` IN ('1', '2', '3'));

То есть, я хочу видеть в gridView пользователя, если у него нет записи в user_property с соответствующим property_id, который есть в определении gridView. Просто чтоб в гриде для этого свойства у пользователя было false/0/not set etc.
PS: настоящая предметная область несколько отличается, упростил для понимания, заменив на user и property. Сформулировать гугл-запрос, который даст мне нужный ответ, у меня не вышло.
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@Korvin3 Автор вопроса
Сам спросил - сам отвечу :)
Ошибка была в модели User. В связях использовался where, а нужно было onCondition. Тогда sql выглядит так:
SELECT COUNT(*) FROM `user` LEFT JOIN `user_property` `propertyName` ON `user`.`id` = `propertyName`.`user_id` AND `propertyName`.`property_id`=1;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы