2016-07-27 7 views
0

У меня есть таблица продуктов и товарных таблиц. Продукт имеет отношение к товарным линиям. Я хочу иметь одно окно поиска и искать поля из таблицы продуктов и полей из таблицы продуктов.Yii2 одно окно поиска для поиска полей из двух разных таблиц

Мои модели Поиск товаров

public function search($params) 
    { 
     $query = Product::find()->where(['product_id' => $this->getProductID()]); 

     // add conditions that should always apply here 
     $query->joinWith('productlines'); 

     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]); 

     $this->load($params); 

     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

     // grid filtering conditions 
     $query->andFilterWhere([ 
      'product_id' => $this->product_id, 
      'product_region' => $this->product_region, 
      'product_created' => $this->product_created, 
      'product_lastchecked' => $this->product_lastchecked, 
      'sdsref_id' => $this->sdsref_id, 

     ]); 

     // var_dump($this->getProductID()); exit(); 
     $query->andFilterWhere(['like', 'product_name', $this->product_name]) 
      ->andFilterWhere(['like','product_id', $this->product_id]) 
      ->orFilterWhere(['like', 'product_catalog', $this->code]) 
      ->andFilterWhere(['=', 'product_aka', $this->product_aka]) 
      ->orFilterWhere(['like', 'internal_code' , $this->code]); 

     return $dataProvider; 
    } 

Когда я делаю это я получаю сообщение об ошибке:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'product_id' in where clause is ambiguous 
The SQL being executed was: SELECT COUNT(*) FROM `sim_product` LEFT JOIN `sim_productlines` ON `sim_product`.`product_id` = `sim_productlines`.`product_id` WHERE ((`product_id` IN ('2', '3')) OR (`product_catalog` LIKE '%A%')) OR (`internal_code` LIKE '%A%') 

Может кто-нибудь помочь мне, где я буду неправильно и что может быть возможным решением.

Благодаря

+0

префикс имени таблицы ' WHERE ((tableName.product_id') Mysql не смог разрешить имя столбца, потому что обе таблицы имеют одинаковое имя. –

+0

Если я добавлю имя таблицы, оштрафованный столбец –

+0

использовать queryBuilder. –

ответ

0

Yii2 позволяет префикс имен столбцов в ActiveQuery, таких как:

$query->andFilterWhere(['like', 'product.product_name', $this->product_name]) 
    ->andFilterWhere(['like','productline.product_id', $this->product_id]) 
    ->orFilterWhere(['like', 'productline.product_catalog', $this->code]) 
    ->andFilterWhere(['=', 'product.product_aka', $this->product_aka]) 
    ->orFilterWhere(['like', 'product.internal_code' , $this->code]); 

Источник: http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data

Смотрите раздел "Соединение с отношениями"