Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Myst
Сообщения: 29
Зарегистрирован: 2016.01.22, 15:06

Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение Myst » 2017.03.28, 09:39

Прошу помочь с настройкой фильтра по связанным полям.
В SearchModel строится запрос из двух таблиц 'shop_product' (product_id, published)- продукты и 'shop_product_value' (product_id, param_id, value)- значения параметров продуктов, которые связаны по product_id:

Код: Выделить всё

$query = (new \yii\db\Query())
		->select(['p.product_id', 'Опубликован' => 'p.published', 'Price' => 'p1.value', 'Description' => 'p2.value'])
		->from(['p' => 'shop_product'])
		
		->leftJoin('shop_product_value AS p1', 'p.product_id = p1.product_id AND p1.param_id IN (2)')
		->leftJoin('shop_product_value AS p2', 'p.product_id = p2.product_id AND p2.param_id IN (5)')
		
		->indexBy('product_id');
далее:

Код: Выделить всё

$dataProvider = new ActiveDataProvider([
			'query' => $query,
			'pagination' => [
				'pageSize' => 10,
			],
		]);
		...
		$query->andFilterWhere([
			'p.product_id' => $this->product_id, // генерирует поле фильтра
			'p.published' => $this->published,  //фильтра нет!
			'p1.value' => ???????, //фильтра нет!

		]);
		...
		return $dataProvider;
		
Как заставить фильтр работать в такой ситуации?
Почему если добавить псевдоним 'Опубликован' => 'p.published', фильтр перестает выводится, но если убрать 'Опубликован' то фильтр появляется?
Как вывести фильтр для полей из leftJoin???
GridView пока вывожу так:

Код: Выделить всё

GridView::widget([
		'dataProvider' => $dataProvider,
		'filterModel' => $searchModel,
		//'columns' => $columns,
	]);
Буду благодарен за помощь, перепробовал уже всё что можно :-(...

Аватара пользователя
Alexum
Сообщения: 675
Зарегистрирован: 2016.09.26, 10:00

Re: Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение Alexum » 2017.03.28, 10:14

Можно в модели shop_product добавить два публичных свойства специально под это дело. Н-р: product_value_p1, product_value_p2. Прописать эти свойства в rules основной и searchModel, чтобы по ним пропускались поисковые данные. В фильтрах прописываем соответствия:

Код: Выделить всё

...
$query->andFilterWhere([
'p1.value' => $this->product_value_p1,
'p2.value' => $this->product_value_p2,
]);
...
В GridVIew добавляем две колонки для атрибутов product_value_p1, product_value_p2 а в value этих колонок выводим значения из p1.value и p2.value.

someweb
Сообщения: 545
Зарегистрирован: 2017.03.09, 10:12

Re: Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение someweb » 2017.03.28, 10:22

Уберите русские псевдонимы

Код: Выделить всё

'Опубликован' => 'p.published'
используйте attributeLabels.

Код: Выделить всё

'p.published' => $this->published,  //фильтра нет!
А published объявили как public property и добавили в rules?
Раз в SearchModel не используете AR, то не надо наследоваться от нее, наследуйте от Model и пропишите все нужные поля фильтра как public свойства и добавтье их в rules.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Myst
Сообщения: 29
Зарегистрирован: 2016.01.22, 15:06

Re: Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение Myst » 2017.03.28, 10:58

колонки в GridView строятся динамически циклом foreach на основе построенного запроса, по этому прописывать их туда явно нельзя

Myst
Сообщения: 29
Зарегистрирован: 2016.01.22, 15:06

Re: Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение Myst » 2017.03.28, 11:03

someweb писал(а):
2017.03.28, 10:22
Уберите русские псевдонимы

Код: Выделить всё

'Опубликован' => 'p.published'
используйте attributeLabels.

Код: Выделить всё

'p.published' => $this->published,  //фильтра нет!
А published объявили как public property и добавили в rules?
Раз в SearchModel не используете AR, то не надо наследоваться от нее, наследуйте от Model и пропишите все нужные поля фильтра как public свойства и добавтье их в rules.
русские псевдонимы берутся из базы, и там же могут измениться пользователем, по этому как прописать их в attributeLabels?

Myst
Сообщения: 29
Зарегистрирован: 2016.01.22, 15:06

Re: Фильтры в GridView. leftJoin и andFilterWhere как вывести?

Сообщение Myst » 2017.03.28, 12:09

someweb писал(а):
2017.03.28, 10:22

Раз в SearchModel не используете AR, то не надо наследоваться от нее, наследуйте от Model
согласен, а есть ли возможность использовать AR + вместо joinleft одну и ту же связь в модели несколько раз с разными условиями? ведь по сути все joinleft вытаскивают данные из одной и той же таблицы, тогда в модели shop_product появилась бы одна связь:

Код: Выделить всё

 public function getValue()
    {
        return $this->hasMany(Value::className(), ['product_id' => 'product_id']);
    }
может так проще? И тогда где должны появится условия?

Ответить