Ребят подскажите как правильно настроить. Мне надо в IndexAction от ActiveController подключить модельку ProductSearch и фильтр по связанному полю title из product_measures.
Модельки
class Product extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'product';
}
public function getMeasure()
{
return $this->hasOne(ProductMeasures::class, ['id' => 'measure_id']);
}
}
class ProductSearch extends Product
{
public function fields()
{
return array_merge(parent::fields(), ['measureTitle']);
}
public function getMeasureTitle()
{
return $this->measure->title;
}
}
class ProductMeasures extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'product_measures';
}
public function getProducts()
{
return $this->hasMany(Product::className(), ['measure_id' => 'id']);
}
}
Теперь пытаюсь сконфигурировать indexAction. Впринципе вот такая схема работает:
class ProductController extends ActiveController
{
public $serializer = Serializer::class;
public $modelClass = Product::class;
public function actions()
{
return [
'index' => [
'class' => IndexAction::class,
'modelClass' => ProductSearch::class,
'dataFilter' => [
'class' => 'yii\data\ActiveDataFilter',
'searchModel' =>(new DynamicModel(['measureTitle']))->addRule(['measureTitle'], 'string', ['min' => 1]),
'attributeMap' => [
'measureTitle' => '{{product_measures}}.[[title]]'
]
],
'prepareSearchQuery' => function (ActiveQuery $query, $requestParams) {
return $query->joinWith(['measure']);
},
]
];
}
}
Но хотелось бы настройки modelClass и dataFilter->searchModel держать в одном файле.
Сейчас если сделать dataFilter->searchModel=> (new ProductSearch) Вывалит баг:
Unknown filter attribute "measureTitle"
Фиксим:
class ProductSearch extends Product
{
public $measureTitle;
public function rules()
{
return [
[['measureTitle'], 'string']
];
}
...
Фильтрация работает но получаем в выдаче везде "measureTitle": null
Как победить?