Я хочу получить данные на основе двух таблиц 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 предлагает использовать "joinWith", если вам нужно выполнить запрос левого соединения с активной записью. Поэтому в вашем случае вам нужно что-то вроде этого:
$courses = Course::find()
->select('course.name')
->joinWith('student_in_course')
->where(['student_in_course.student_id' => $student_id])
->all();
Пожалуйста, обратитесь к официальным документам Yii2.
Прежде всего, 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');
}
}
Да, ActiveRecord
- это то, что я бы предпочел сделать с этим, но дело в том, что если вы собираетесь отображать в GridView
или ListView
с помощью activeDataProvider
то вам может понадобиться обновить/настроить запрос в serachModel, а не писать отдельную функцию с запросом в model
или как некоторые люди пишут внутри действия контроллера, пока только если вы используете настраиваемое представление и отображаете его вручную и хотите, чтобы результирующий набор как array
или объект activedataprovider
итерацию на нем и отображал записи, тогда ответ, предложенный @GiulioG
применимо. Но то, что нужно заметить в обоих сценариях, заключается в том, что вы должны определить соответствующие relations
и вам не нужно вручную использовать joins
.
viaTable()
как оно использует отношения и не позволяет заполнить ваши модели дополнительными SQL-запросами.