Я пытаюсь установить фильтр для связанной модели в виджет 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', ],
Что правильно отображает имя службы из соответствующей модели.
Я не вижу, что я делаю неправильно, но поле фильтра для атрибута для службы вообще не отображается.
На самом деле это намного проще, чем кажется.
добавьте column_name
в безопасный атрибут.
добавить соединение с query- $query->joinWith(['serviceName','roomCategory']);
добавьте условие фильтра, например:
->andFilterWhere(['like', 'services.services', $this->service_name]) ->andFilterWhere(['like', 'room_category.room_category', $this->room_category]);
если хотите добавить сортировку, добавьте код наподобие:
$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
иначе это приведет к возникновению ошибки.