laravel模型關聯(多對多)

多對多

例如一個學生需要報多個興趣班,同時每個興趣班也會有多個學生,學生和興趣班之間就是多對多的關係,要定義這種關聯,需要三個數據庫表: studentclasses和 classes_studentclasses_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)就可以了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章