Nano Hash - криптовалюты, майнинг, программирование

Yii2 - модели, связанные с dataProvider, не установлены

У меня есть следующая 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?

28.01.2020

  • В классе Computer у вас должно быть отношение с именем getMainboard(), которое будет определять отношение. mainboard в данном случае не имя таблицы, а имя отношения. 29.01.2020

Ответы:


1

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

  • Попробуйте использовать ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ с методом Join вместо ВНУТРЕННЕГО СОЕДИНЕНИЯ.
  • $query->join(Computer::tableName(), Computer::tableName() . '.id = '= ' . Mainboard::tableName() . '.id') или что-то в этом роде
29.01.2020
  • Большое спасибо, работает нормально. Надеюсь, я найду более приятное решение для этого. $query = Computer::find() ->join('FULL OUTER JOIN', Mainboard::tableName(), Mainboard::tableName() . '.computer_id = ' . Computer::tableName() . '.id' ); 29.01.2020

  • 2
    $query = self::find();
    $query->innerJoin(Mainboard::tableName(), 'computer.mainboard_id=mainboard.id')
          ->select('computer.*, mainboard.*');
    

    Попробуй это

    04.02.2020

    3
    `$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']);
    }
    
    29.01.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..