@Tim02

Yii2. Как правильно настроить фильтрацию связанных полей в IndexAction у ActiveController?

Ребят подскажите как правильно настроить. Мне надо в 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
Как победить?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы