padlyuck Успокоил что это как минимум близко к правде. Итоговое рабочее решение (Но оно мне не нравится ^_^ )
attr_ - отсебятина дабы потом знать что это данные из связки с атрибутами.
После attr_ указываем имя атрибута из таблицы object_fields
getAttr - мой геттер тут ничего интересного все банально.
В views указываемecho GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $dataFilter,
'columns' => [
.....
[
'attribute' => 'attr_rooms',
'value' => function ($model) {
return $model->getAttr("rooms")->value;
}
],
.....
],
]); ?>
Далее все относится к модели
Объявляем свойство attr_roomsclass Objects extends \yii\db\ActiveRecord
{
...
public $attr_rooms;
...
Так же добавляем правило....
public function rules()
{
return [
....
[['attr_rooms'], 'safe'],
....
];
}
....
Чуть не забыл - указываем связь многие ко многим.public function getObjectFields()
{
return $this->hasMany(ObjectFields::className(), ['id' => 'object_attr_id'])
->viaTable(ObjectFieldValues::tableName(), ['object_id' => 'id']);
}
Ну и сам поиск (фильтр)public function adminFiltr($params)
{
$query = Objects::find()->joinWith('objectFields');
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
if ($this->load($params))
// регистрируем поиск по параметрам если они переданы, не пустые и начинаются с "attr_"
// исключаем attr_ и используем название как название нашего атрибута из object_fields
foreach ($params[$this->formName()] as $paramName => $paramValue) {
if (!empty($paramValue) and substr($paramName, 0, 5) == 'attr_') {
$paramName = substr($paramName, -5);
$query->andFilterWhere([
'object_field_values.value' => $paramValue,
'object_fields.name' => $paramName,
]);
}
}
return $dataProvider;
}
Все это работает - НО реализация меня не устраивает - переделаю - отпишусь (если не забуду).