什么是从2个表中获取数据的最佳Yii方式?

时间:2017-12-10 07:38:04

标签: php mysql yii yii2 active-record-query

我想基于2个数据库表获取数据

有:

if ($this->form_validation->run())
{
    $this->session->set_flashdata('message', 'We got your submitted user : '.$data.' username');
}

我想获得所有 course table student_in_course table (with foreign key course_id)

基于course.name 对于特定的student_in_course.course_id

使用ActiveRecord(或其他推荐方式)进行此操作的最佳做​​法是什么?

提前致谢

3 个答案:

答案 0 :(得分:3)

首先,如果你打算使用YII,ActiveRecord是最好的方法,似乎你要使用交叉引用表使用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');
     }
}

答案 1 :(得分:0)

Yii2文档建议使用'joinWith',以防您需要使用Active记录执行左连接查询。所以在你的情况下你会想要这样的东西:

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

请参阅Yii2 official docs

答案 2 :(得分:0)

是的,ActiveRecord是我更喜欢这样做的,但问题是,如果您打算使用GridView ListViewactiveDataProvider展示需要在serachModel中更新/调整查询,而不是在model中编写一个单独的函数或者在控制器的操作中写一些人,直到除非您使用自定义视图并手动显示它并且想要结果集作为arrayactivedataprovider对象进行迭代并显示记录,然后@GiulioG建议的答案适用。但在这两种方案中要注意的是,您应该定义适当的relations,而不需要手动使用joins