За последние 24 часа нас посетили 57398 программистов и 1809 роботов. Сейчас ищут 1062 программиста ...

Gridview, фильтрация связанных таблиц

Тема в разделе "Yii", создана пользователем ansta, 16 сен 2017.

  1. ansta

    ansta Новичок

    С нами с:
    4 май 2017
    Сообщения:
    14
    Симпатии:
    0
    Добрый день. Есть 2 таблицы: партии и продукты, в партиях есть поле ID_product, по которому они связаны. В грид вывожу партии, через связь вывожу название продукта вместо айдишника, все выводится нормально, работает сортировка для всех полей, в т.ч. и для связанного. Проблема в фильтрации: для обычных полей все работает, для связанного поля - название продукта - никак не отображается input фильтра. Подскажите, пожалуйста, в чем проблема?

    Сортировка выглядит так, она рабочая:
    Код (Text):
    1.         $dataProvider->setSort([
    2.         'attributes' => [
    3.            
    4.             'productsIDProduct.name' => [
    5.                 'asc' => ['products.name' => SORT_ASC],
    6.                 'desc' => ['products.name' => SORT_DESC],
    7.                 'label' => 'Продукт'
    8.             ],
    9.             'shipping_price',
    10.             'storage_life',
    11.         ]
    12.     ]);
    13.   $query->joinWith(['productsIDProduct']);
    gii сгенерировал в модели search такое, фильтр для этих полей работает:
    Код (Text):
    1.      $query->andFilterWhere([
    2.            .............
    3.             'shipping_price' => $this->shipping_price,
    4.             'storage_life' => $this->storage_life,    
    5.      ..............
    6.         ]);
    Пытаюсь для связанного поля сделать так - безрезультатно:
    Код (Text):
    1.    ->andFilterWhere(['like', 'productsIDProduct.name', $this->productName]);
    В самом гриде:
    Код (Text):
    1. <?= GridView::widget([
    2.             'dataProvider' => $dataProvider,
    3.             'filterModel' => $searchModel,
    4.             'id'=>'usong-grid',
    5.             'tableOptions' => [
    6.                 'class' => 'table table-hover table-condensed table-bordered mytab_',
    7.                ],
    8.             'columns' => [
    9.                 ['class' => 'yii\grid\SerialColumn'],            
    10.                 [
    11.                   'attribute' => 'productsIDProduct.name',              
    12.                   'value' => function($model) {
    13.                          return $model->productsIDProduct->name;                
    14.                   }
    15.                 ],          
    16.                 'shipping_price',
    17.                 'storage_life',
     
  2. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Атрибут связанной модели должен фигурировать в методе rules, тогда фильтрация появится.
     
  3. ansta

    ansta Новичок

    С нами с:
    4 май 2017
    Сообщения:
    14
    Симпатии:
    0
    У меня прописано
    Код (Text):
    1. class ConsignmentsSearch extends consignments
    2. {
    3.     public $productName;
    4.     /**
    5.      * @inheritdoc
    6.      */
    7.     public function rules()
    8.     {
    9.         return [
    10.             [['productName'],'safe'],
    11.             [['ID_consignment', 'actually_in_stock', 'count_in_consignment', 'defective_products', 'Products_ID_product', 'WasDel', 'Categories_ID_category'], 'integer'],
    12.             [['arrived', 'storage_life'], 'safe'],
    13.             [['parish_price', 'product_price_in_consignment', 'shipping_price'], 'number'],      
    14.         ];
    15.     }
    Вы это имели в виду?
     
  4. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    И как по вашему программа "узнает", что свойство productName должно быть сопоставлено с атрибутом grid-а "productsIDProduct.name"?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Iz_borka нравится это.