多對多
例如一個學生需要報多個興趣班,同時每個興趣班也會有多個學生,學生和興趣班之間就是多對多的關係,要定義這種關聯,需要三個數據庫表: 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)就可以了