多对多
例如一个学生需要报多个兴趣班,同时每个兴趣班也会有多个学生,学生和兴趣班之间就是多对多的关系,要定义这种关联,需要三个数据库表: student
,classes和 classes_student
。classes_student表存放学生所报兴趣班的信息,classes_student
表的命名是由关联的两个模型按照字母顺序来的,并且包含了 student_id
和 classes_id
字段。
多对多关联通过调用 belongsToMany
这个内部方法返回的结果来定义,例如,我们在 Student模型中定义 classes
方法:
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
protected $table = 'student';
/**
* 获得此学生的课程。
*/
public function classes()
{
return $this->belongsToMany('App\Http\Models\Classes','classes_student','student_id','classes_id');
}
}
其中'App\Http\Models\Classes'是要兴趣班的模型,classes_student是中间表的名字,省略时laravel默认为(关联表名_主表名),student_id和classes_id分别是中间表classes_student中对应student表和classes表的外键,可以省略。
用法:
1、获取学生1所报的兴趣班的信息
$classes = Student::find(1)->classes;
2、也可以对查出的兴趣班进行一些相关的操作,如按照兴趣班的id进行降序排序:
$classes = Student::find(1)->classes()->orderBy('id','desc')->get();
多对多(反向)
可以通过学生获取兴趣班信息了,现在要获取兴趣班下所有学生的信息,就要定义多对多的反向关联,只需要在关联模型中调用 belongsToMany
方法。我们在Classes模型中定义 student
方法:
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Classes extends Model
{
protected $table = 'classes';
/**
* 获得此课程下的学生。
*/
public function student()
{
return $this->belongsToMany('App\Http\Models\Student')
->withPivot('student_id', 'classes_id')
->wherePivot('status', 1);
}
}
belongsToMany中的参数和正向的参数是一样的,在获得这些关联对象后,可以使用模型的 pivot 属性访问中间表的数据,默认情况下 pivot 对象只包含两个关联模型的主键,如果你的classes_student中间表里还有其他额外字段,你必须在定义关联时明确指出:->withPivot('student_id', 'classes_id'),也可以进行中间表字段的选择,如果中间表中的status表示学生报名课程的状态,1表示正常,2表示删除,我希望关联时获取的都是正常的学生,则要加上->wherePivot('status', 1)就可以了