Yii2 - модели, связанные с dataProvider, не установлены - PullRequest
1 голос
/ 28 января 2020

У меня есть следующая SearchModel ComputerSearch, где я выполняю объединение для запроса (я должен отфильтровать поле соответствующей таблицы):

class ComputerSearch extends Computer {

  public function search($params) {
      $query = Computer::find();
      $query->innerJoinWith('mainboard');

      $dataProvider = new ActiveDataProvider([
          'query' => $query,
      ]);

      $this->load($params);

      if (!$this->validate()) {
          return $dataProvider;
      }

      return $dataProvider;
  }
}

Когда я печатаю запрос, с помощью var_dump($query->createCommand()->rawSql); и выполнить вывод, я получу все данные компьютера и материнской платы (это соотношение 1: 1!).

Но: $dataProvider->models[0]->mainboard всегда равно нулю, даже если в базе данных есть данные. Если я вычеркну строку с $query->innerJoinWith('mainboard');, $dataProvider->models[0]->mainboard правильно покажет связанную модель (а на самом деле она есть в дБ). Кто-нибудь может мне сказать, почему связанные модели в $dataProvider не были правильно установлены, когда я присоединяюсь mainboard?

Ответы [ 3 ]

1 голос
/ 29 января 2020

Это может быть ошибкой фреймворка Yii :) У меня была та же проблема:

  • Попробуйте использовать FULL OUTER JOIN с методом Join вместо INNER JOIN
  • $ query-> join (Computer :: tableName (), Computer :: tableName (). '.id =' = '. Mainboard :: tableName ().' .id ') или что-то в этом роде
0 голосов
/ 04 февраля 2020
$query = self::find();
$query->innerJoin(Mainboard::tableName(), 'computer.mainboard_id=mainboard.id')
      ->select('computer.*, mainboard.*');

Попробуйте это

0 голосов
/ 29 января 2020
`$dataProvider->models[0]->mainboard`  this will give you only result 

первой записи, и может быть вероятность, что для первой записи computer
не будет mainboard, либо используйте loop для печати данных, либо вы используете $dataProvider->getModels(), вы найдете реляционные данные в данные каждого компьютера.

И

материнская плата должна иметь отношение к компьютеру, как: В модели компьютера:

public function getMainboard(){
   return $this->hasMany(Mainboard::className(), ['computer_id', 'id']);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...