Какой лучший способ Yii получить данные из 2 таблиц?

0

Я хочу получить данные на основе двух таблиц db

Есть:

 course table
 student_in_course table (with foreign key course_id)

Я хотел бы получить все course.name

на основе student_in_course.course_id для определенного student_in_course.student_id

Какая самая лучшая практика для этого с помощью ActiveRecord (или другого рекомендованного способа)?

заранее спасибо

Теги:
yii2
yii

3 ответа

0
Лучший ответ

Документация Yii2 предлагает использовать "joinWith", если вам нужно выполнить запрос левого соединения с активной записью. Поэтому в вашем случае вам нужно что-то вроде этого:

$courses = Course::find()
  ->select('course.name')
  ->joinWith('student_in_course')
  ->where(['student_in_course.student_id' => $student_id])
  ->all();

Пожалуйста, обратитесь к официальным документам Yii2.

3

Прежде всего, ActiveRecord - лучший подход, если вы собираетесь работать с YII, похоже, что вы используете использование таблицы перекрестных ссылок via() или viaTable().

class Student extends ActiveRecord{

     public function getStudentsInCourses() {
          return $this->hasMany(StudentInCourses::className(), ['student_id' => 'id']);
      }

     public function getCourses() {
          return $this->hasMany(Course::className(), ['id' => course_id'])
                   ->via('studentsInCourses');
     }
}
  • 0
    +1 голосование за упоминание viaTable() как оно использует отношения и не позволяет заполнить ваши модели дополнительными SQL-запросами.
0

Да, ActiveRecord - это то, что я бы предпочел сделать с этим, но дело в том, что если вы собираетесь отображать в GridView или ListView с помощью activeDataProvider то вам может понадобиться обновить/настроить запрос в serachModel, а не писать отдельную функцию с запросом в model или как некоторые люди пишут внутри действия контроллера, пока только если вы используете настраиваемое представление и отображаете его вручную и хотите, чтобы результирующий набор как array или объект activedataprovider итерацию на нем и отображал записи, тогда ответ, предложенный @GiulioG применимо. Но то, что нужно заметить в обоих сценариях, заключается в том, что вы должны определить соответствующие relations и вам не нужно вручную использовать joins.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню