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)就可以了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值