laravel中模型之间的相对关系

一,一对一的关系

(1)正向一对一.

class Phone extends Model{

public function user(){

return $this->hasOne(\App\User::class);

}

}

一个手机号对应一个用户,这样对应的是一对一的关系,laravel的查询构造器会假设 phone有一个外键叫user_id,如果外键的名字不是这个,可以通过給hasOne()方法传递第二参数来改变.例如:

return $this->hasOne(\App\User::class,'obejct_id');

(2)反向一对一.

class User extends Model{

public function phone(){

return $this->belongsTo(\App\Phone::class);

}

}

一个用户拥有一个手机号,这样是一个反向的一对一的关系,需要注意的是,belongsTo和hasOne稍微有些不一样 他会尝试在当前类User下找Phone类的外键 并默认外键的名字为phone_id,他会取匹配phone上的id如果外键的参数并不是这个.依然可以传递第二个参数给belongsTo()方法来达到自定义外键名字的目的

二,一对多的关系

(1)正向一对多.

class article extends Model{

public function comments(){

return $this->hasMany(\App\Comment::class);

}

}

和一对一一样, hasMany会去对应关系的模型中寻找外键,如果没有指定那么外键的名字在本例中会是article_id,如果想手动指定,可以给hasMany传递第二个参数来指定.例如:

return $this->hasMany(\App\Comment::class,'object_id');

(2)反向一对多

这个和反向一对一一样,一个article可以对应多篇评论,所以它是hasMany,而一篇评论只能出现在一个文章下所以是belongsTo,

class comment extends Model{

public function article(){

return $this->belongsTo(\App\Article::class);

}

}

同样的 他默认会用自己类下面的 article_id去对应 article表中的id,如果找不到的话这里就会报错.同样的的,仍然可以手动指定要拿什么外键去对应.例如

return $this->belongsTo(\App\Article::class,'object_id');这样的话他就会用本类下面的object_id去对应.

三,多对多的关系.

(1)中间表.

多对多的关系比较复杂,如果直接对应容易产生高耦合的代码.所以通用的解决方法就是建立一个中间表来存储对应双方的关系.

class User extends Model{

public function admin(){

return $this->belongsToMany(\App\Admin::class);

}

}

class Admin extends Model{

public function user(){

return $this->belongsToMany(\App\User::class);

}

}

这样 只要有 admin_user这张中间表存在.那么关系就自然的对应起来了.

除了自定义连接表表名,您也可以通过给 belongsToMany 方法再次传递额外参数来自定义连接表里的键的字段名称。第三个参数是定义此关联的模型在连接表里的键名,第四个参数是另一个模型在连接表里的键名:

2017-11-10 15-07-04屏幕截图.png

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容