Я пытаюсь построить вид сетки с отношениями «многие ко многим». Поэтому мне нужен запрос для ActiveDataProvider
,
У меня есть таблица ‘ressource’, таблица ‘type’ и между ними таблица ‘historyique’.
У меня хорошие отношения в моих моделях, но я не знаю, как создать dataProvider.
В моей модели Ressource:
public function getHistorique()
{
return $this->hasMany(Historique::className(), ['idType' => 'idType']);
}public function getType()
{
return $this->hasMany(Type::className(), ['idType' => 'idType'])
->viaTable(Historique::className(), ['idRessource' => 'idRessource']);
}
В моей модели Historique:
public function getType()
{
return $this->hasOne(Type::className(), ['idType' => 'idType']);
}
public function getRessource()
{
return $this->hasOne(Ressource::className(), ['idRessource' => 'idRessource']);
}
и наконец в моей модели Тип:
public function getHistorique()
{
return $this->hasMany(Historique::className(), ['idType' => 'idType']);
}
public function getRessource()
{
return $this->hasMany(Ressource::className(), ['idRessource' => 'idRessource'])
->viaTable(Historique::className(), ['idType' => 'idType']);
}
Таким образом, в контроллере (на самом деле мой ModelSearch) я хочу иметь ресурсы с типом из истории таблицы. Я не знаю, что я должен добавить после
Ressource::find();
Я думаю, что вы используете RessourceSearch()->search()
метод. Так что внутри у вас есть что-то вроде этого:
$query = Ressource::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
// Here is list of searchable fields of your model.
$query->andFilterWhere(['like', 'username', $this->username])
->andFilterWhere(['like', 'auth_key', $this->auth_key])return $dataProvider;
Итак, в основном вам нужно добавить дополнительные Where
Вы ваш запрос и заставить присоединиться к таблице отношений. Вы можете сделать это с помощью joinWith
способ присоединиться к дополнительному отношению и andFilterWhere
с помощью table.field
запись для добавления параметров фильтра. Например:
$query = Ressource::find();
$query->joinWith(['historique', 'type']);
$query->andFilterWhere(['like', 'type.type', $this->type]);
$query->andFilterWhere(['like', 'historique.historique_field', $this->historique_field]);
Также не забудьте добавить правила для дополнительных фильтров в вашу модель поиска. Например, вы должны добавить в свой rules()
массив что-то вроде этого:
public function rules()
{
return [
// here add attributes rules from Ressource model
[['historique_field', 'type'], 'safe'],
];
}
Вы можете использовать любые дополнительные правила проверки для этих полей
Других решений пока нет …