Поставщик данных Yii2 со многими отношениями

Я пытаюсь построить вид сетки с отношениями «многие ко многим». Поэтому мне нужен запрос для 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();

1

Решение

Я думаю, что вы используете 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'],
];
}

Вы можете использовать любые дополнительные правила проверки для этих полей

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]