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. Сформулировать гугл-запрос, который даст мне нужный ответ, у меня не вышло.
Korvin3 дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац).
В противном случае, ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.
Сам спросил - сам отвечу :)
Ошибка была в модели User. В связях использовался where, а нужно было onCondition. Тогда sql выглядит так:
SELECT COUNT(*) FROM `user` LEFT JOIN `user_property` `propertyName` ON `user`.`id` = `propertyName`.`user_id` AND `propertyName`.`property_id`=1;