laravel 模型中的一对一,一对多,多对多的关联
Posted 独孤剑—宇枫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel 模型中的一对一,一对多,多对多的关联相关的知识,希望对你有一定的参考价值。
一对一
一对一关联是一个非常简单的关联关系,例如,一个 User
模型有一个与之关联的 Phone
模型,一个人对应一个手机,一个手机对应一个人!
user表:id,user_name;
phone表:id,phone_name,user_id;
主表:user表,从表:phone表;
正向关联
return $this->hasOne(‘AppPhone‘, ‘foreign_key‘, ‘local_key‘);
1 <?php 2 3 namespace App; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class User extends Model{ 8 /** 9 * 获取关联到用户的手机 10 */ 11 public function phone() 12 { 13 return $this->hasOne(‘AppPhone‘, ‘user_id‘, ‘id‘); 14 } 15 } 16
我们可以从 User
中访问 Phone
模型,相应地,也可以在 Phone
模型中定义关联关系从而让我们可以拥有该手机的 User
。我们可以使用 belongsTo
方法定义与 hasOne
关联关系相对的关联:
反向关联:belongTo
return $this->belongsTo(‘AppUser‘, ‘foreign_key‘, ‘other_key‘);
1 <?php 2 3 namespace App; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class Phone extends Model{ 8 /** 9 * 获取拥有该手机的用户 10 */ 11 public function user() 12 { 13 return $this->belongsTo(‘AppUser‘, ‘user_id‘, ‘id‘); 14 } 15 } 16
一对多
一个博客文章有多个评论,一个评论只属于某一个文章
博客文章 post:id,title,author,content,
评论:comment:id,post_id,
return $this->hasMany(‘AppComment‘, ‘foreign_key‘, ‘local_key‘);
return $this->belongsTo(‘AppPost‘, ‘foreign_key‘, ‘other_key‘);
1 <?php 2 3 namespace App; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class Post extends Model{ 8 /** 9 * 获取博客文章的评论 10 */ 11 public function comments() 12 { 13 return $this->hasMany(‘AppComment‘, ‘post_id‘, ‘id‘); 14 } 15 }
1 <?php 2 3 namespace App; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class Comment extends Model{ 8 /** 9 * 获取评论对应的博客文章 10 */ 11 public function post() 12 { 13 return $this->belongsTo(‘AppPost‘, ‘post_id‘, ‘id‘); 14 } 15 }
withDefault?这个是啥玩意?干嘛用的?
在 Laravel 5.4 中新增加的一个方法
在实际的过程中,有可能会出现这种情况,某个用户删除了,但是这个用户对应的Phone记录没有删除,或者某个文章删除了,但是这个文章对应的评论没有删除,当我们用Phone Model查询用户的时候,或者用评论查询文章的时候,(用belongTo查询的),就会返回一个null值,有时候这个null值会引发一些问题,现在有点头绪了吧?withDefault()应运而生。
1 /** 2 * 获取文章作者 3 */ 4 public function user() 5 { 6 return $this->belongsTo(‘AppUser‘)->withDefault(); 7 }
这种情况下,withDefault
会返回一个 User Model 实例,从而避免了 null
引发的问题。withDefault
方法还支持接收参数, 为生成的实例对象填充数据,参数类型可以是数组或者闭包。
return $this->belongsTo(User::class)->withDefault([ ‘name‘ => ‘我是xzj‘, ]); return $this->belongsTo(User::class)->withDefault(function ($user) { $user->name = ‘我是xzj‘; });
多对多
多对多关联比 hasOne
和 hasMany
关联关系要稍微复杂一些。这种关联关系的一个例子就是在权限管理中,一个用户可能有多个角色,同时一个角色可能被多个用户共用。例如,很多用户可能都有一个“Admin”角色。要定义这样的关联关系,需要三张数据表:users
、roles
和 role_user
,role_user
表按照关联模型名的字母顺序命名,并且包含 user_id
和 role_id
两个列。
多对多关联通过编写调用 belongsToMany
方法返回结果的方式来定义,例如,我们在 User
模型上定义 roles
方法:
users表:id,......;
roles表:id,.....;
role_user表:user_id,role_id
1 <?php 2 3 namespace App; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class User extends Model{ 8 /** 9 * 用户角色 10 */ 11 public function roles() 12 { 13 //这里要注意,Role前必须加APP,还有就是第二个参数是表名,数据库里那个表叫啥,他就叫啥,第三个参数是本类的字段,第四个参数是要查找的字段 14 return $this->belongsToMany(‘AppRole‘,‘role_user‘,‘user_id‘,‘role_id‘); 15 } 16 }
$userinfo = $user->find($id);
$return_data = $userinfo->with(‘roles‘)->get();
$return_data = $userinfo->roles()->get();
接着你就可以使用得到的数据了!
以上是关于laravel 模型中的一对一,一对多,多对多的关联的主要内容,如果未能解决你的问题,请参考以下文章
laravel ORM 一对一 一对多 多对多 原生的MYSQL怎么写
CoreData :NSFetchedResultsController 一对多对多的关系