Настройка фильтра для связанной модели в GridView

Я пытаюсь установить фильтр для связанной модели в виджет GridView Yii2, но я продолжаю получать ошибку, так как значение фильтра должно быть целым числом.

Я следовал этому вопросу . Теперь у меня есть две модели Services.php и ServiceCharge.php .

В ServiceCharge.php отношение устанавливается так:

 public function getServiceName() { return $this->hasOne(Services::className(),['id'=>'service_name']); } 

В ServiceChargeSearch.php код выглядит так:

 <?php namespace app\models; use Yii; use yii\base\Model; use yii\data\ActiveDataProvider; use app\models\ServiceCharges; /** * ServiceChargesSearch represents the model behind the search form about `app\models\ServiceCharges`. */ class ServiceChargesSearch extends ServiceCharges { /** * @inheritdoc */ public function attributes() { // add related fields to searchable attributes return array_merge(parent::attributes(), ['serviceName.services']); } public function rules() { return [ [['id'], 'integer'], [['charges_cash', 'charges_cashless'], 'number'], [['id', 'serviceName.services', 'room_category'], 'safe'], ]; } /** * @inheritdoc */ public function scenarios() { // bypass scenarios() implementation in the parent class return Model::scenarios(); } /** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params) { $query = ServiceCharges::find(); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $dataProvider->sort->attributes['serviceName.services'] = [ 'asc' => ['serviceName.services' => SORT_ASC], 'desc' => ['serviceName.services' => SORT_DESC], ]; $query->joinWith(['serviceName']); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere([ 'id' => $this->id, // 'service_name' => $this->service_name, 'room_category' => $this->room_category, 'charges_cash' => $this->charges_cash, 'charges_cashless' => $this->charges_cashless, ]) ->andFilterWhere(['LIKE', 'serviceName.services', $this->getAttribute('serviceName.services')]); return $dataProvider; } } 

и в моем Gridview он настроен следующим образом:

 [ 'attribute'=>'service_name', 'value'=>'serviceName.services', ], 

Что правильно отображает имя службы из соответствующей модели.

Я не вижу, что я делаю неправильно, но поле фильтра для атрибута для службы вообще не отображается.

На самом деле это намного проще, чем кажется.

  1. добавьте column_name в безопасный атрибут.

  2. добавить соединение с query- $query->joinWith(['serviceName','roomCategory']);

  3. добавьте условие фильтра, например:

     ->andFilterWhere(['like', 'services.services', $this->service_name]) ->andFilterWhere(['like', 'room_category.room_category', $this->room_category]); 
  4. если хотите добавить сортировку, добавьте код наподобие:

     $dataProvider->sort->attributes['service_name'] = [ 'asc' => ['services.services' => SORT_ASC], 'desc' => ['services.services' => SORT_DESC], ]; $dataProvider->sort->attributes['room_category'] = [ 'asc' => ['room_category.room_category' => SORT_ASC], 'desc' => ['room_category.room_category' => SORT_DESC], ]; 

Вот и все. Как сортировка, так и фильтрация для соответствующей таблицы отлично работают.

Примечание. Удалите проверку по умолчанию, например integer, для соответствующего столбца и фильтрацию по умолчанию, сгенерированную gii иначе это приведет к возникновению ошибки.