Фильтр по связанному полю в GridView

Я использовал http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/ и это здорово.

Все работает нормально, но я застреваю после добавления «Сценарий 3 шага»:

// filter by parent name
$query->joinWith(['parent' => function ($q) {
        $q->where('parent.first_name LIKE "%' . $this->parentName . '%" ' .
        'OR parent.last_name LIKE "%' . $this->parentName . '%"');
}]);

он запускает запрос mysql, например:

SELECT COUNT(*) FROM `person` LEFT JOIN `country` ON 
`person`.`country_id` = `country`.`id` LEFT JOIN `person` `parent` ON 
`person`.`id` = `parent`.`parent_id` WHERE parent.first_name LIKE "%%" OR
 parent.last_name LIKE "%%"

Который не возвращает никаких записей.

Я пробовал что-то вроде:

        if ($this->parentName) {
            $query->joinWith(['parent' => function ($q) {
                $q->where('parent.first_name LIKE "%' . $this->parentName . '%" ' .
                'OR parent.last_name LIKE "%' . $this->parentName . '%"');
            }]);
        }else {
            $query->joinWith('parent');
        }

но это дает мне ошибку, например:

Trying to get property of non-object
1. in /var/www/html/advanced/common/models/Person.php  at line 54
/* Getter for parent name */
    public function getParentName() {
        return $this->parent->fullName;          // its 54th line
    }

person Er.KT    schedule 26.02.2015    source источник
comment
Пожалуйста, исправьте ссылку на урок   -  person soju    schedule 26.02.2015
comment
@soju: ссылка обновлена   -  person Er.KT    schedule 26.02.2015


Ответы (2)


Этот учебник должен быть обновлен.

Нет необходимости создавать геттер для родительского имени, вы должны добавить это в свою модель поиска:

public function attributes()
{
    // add related fields to searchable attributes
    return array_merge(parent::attributes(), ['parent.fullName']);
}

public function rules()
{
    return [
        ...
        ['parent.fullName', 'safe'],
        ...
    ];
}

А затем просто измените свой поисковый запрос следующим образом:

$query->andFilterWhere([
    'OR',
    ['LIKE', 'parent.first_name ', $this->getAttribute('parent.fullName')]
    ['LIKE', 'parent.last_name ', $this->getAttribute('parent.fullName')]
]);

И не забудьте отобразить parent.fullName в вашем gridview вместо parentName.

Подробнее: http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#working-with-model-relations

person soju    schedule 26.02.2015
comment
Я не получил от вас ответа, у меня есть две модели, простая модель и модель поиска, функция attributeLabels () { находится в простой модели, функция rules () теперь находится в модели поиска, что означает return array_merge (parent:: attributes (), ['родитель.полное имя']); ? и что такое атрибуты функции ()? - person Er.KT; 05.03.2015

Проблема решена

До:

    Trying to get property of non-object
    1. in /var/www/html/advanced/common/models/Person.php  at line 54    
    public function getParentName() {
        return $this->parent->fullName;          // its 54th line
    }

После

    public function getParentName() {
        return (!empty ($this->parent->fullName)) ? $this->parent->fullName : ' -- ' ;        
    }
person Er.KT    schedule 11.03.2015