2015-07-14 2 views
2

Я боролся с фильтрацией CGridView с использованием соответствующей колонки модели, у меня есть две моделей автомобилей и цвет, поэтому цвет has_many автомобилей и автомобили belongs_to цвет. Столбец сетки из соответствующей модели отображается в порядке, я просто не могу фильтровать его. Я получаю ошибку MySQLYii, реляционная модель фильтр SERACH

Column not found: 1054 Unknown column 'carName' 

Цвет модель HAS_MANY - Автомобили

Я declaired переменного $ carName от модели автомобиля, так что эта модель может увидеть его.

public $carName; 
public function rules() 
{ 
    return array(
      array('id, carName, colourName', 'safe', 'on'=>'search'), 
       ) 
} 
public function relations() 
{ 

    return array(
       'CarsObj'=>array(self::HAS_MANY, 'Cars', 'colourID') 
    ); 
} 

public function search() 
{ 

    $criteria=new CDbCriteria; 
    $criteria->with = "CarsObj"; 
    $criteria->compare('carName', $this->carName, true); 

    $criteria->compare('id',$this->id); 
    $criteria->compare('colourName',$this->colourName,true); 


    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
    )); 
} 

Модель автомобиля BELONGS_TO - Цвет

public function relations() 
{ 
return array( 
    'ColourObj'=>array(self::BELONGS_TO, 'Colour', 'colourID') 
); 
} 

CGridView, я с помощью поиска цвета модели, как мой DataProvider

$model = new Colour('search'); 
$data = $model->search(); 
$this->widget('zii.widgets.grid.CGridView', array(
      'dataProvider'=>$data 
      ,'filter'=>$model 
      ,'pager'=>array('header'=>'') 
      ,'columns'=>array(//related model column 
        'id', 
        'colourName', 
         array(
          'header' => 'carName', 
          'type' => 'raw', 
          'name' => 'carName', 
          'value' => function($data, $row) { //$data is item of DataProvider, $row is number of row (starts from 0) 
           $carNames= CHtml::listData((array)$data->ColourObj, 'id', 'carName'); 
           return implode(', ', $carNames); 
          } 
          ) 

ответ

0

По умолчанию CActiveRecord используя ленивые нагрузки. Вам нужно установить атрибут together true. Также рекомендуется установить псевдоним таблицы при использовании with.

public function search(){ 
    $criteria=new CDbCriteria; 
    $criteria->together = true; 
    $criteria->with = 'CarsObj'; 
    $criteria->compare('CarsObj.carName',$this->carName,true); 
    $criteria->compare('t.id',$this->id); 
    $criteria->compare('t.colourName',$this->colourName,true); 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
    )); 
} 
+0

Отличная !!, это решает мою проблему, спасибо ali @SiZE. Это сделало мой день, Это уже дало мне головную боль –

0

Попробуйте

поиска публичной функции () {

$criteria=new CDbCriteria; 
$criteria->with = "CarsObj"; 
$criteria->compare('CarsObj.carName', $this->carName, true); 

$criteria->compare('id',$this->id); 
$criteria->compare('colourName',$this->colourName,true); 


return new CActiveDataProvider($this, array(
    'criteria'=>$criteria, 
)); 

}

+0

Я попытался как '$ criteria-> сравнить ('CarsObj.carName', $ this-> carName, правда);' и ' $ criteria-> сравнить ('carName', $ this- -> carName, true); ' У меня такая же ошибка, нет разницы –

Смежные вопросы