laravel 反向一对一_laravel 模型中的一对一,一对多,多对多的关联

一对一

一对一关联是一个非常简单的关联关系,例如,一个 User 模型有一个与之关联的 Phone 模型,一个人对应一个手机,一个手机对应一个人!

user表:id,user_name;

phone表:id,phone_name,user_id;

主表:user表,从表:phone表;

正向关联

return $this->hasOne(‘AppPhone‘, ‘foreign_key‘, ‘local_key‘);

1 <?php2

3 namespace App;4

5 useIlluminateDatabaseEloquentModel;6

7 class User extendsModel{8 /**9 * 获取关联到用户的手机10 */

11 public functionphone()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 <?php2

3 namespace App;4

5 useIlluminateDatabaseEloquentModel;6

7 class Phone extendsModel{8 /**9 * 获取拥有该手机的用户10 */

11 public functionuser()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 <?php2

3 namespace App;4

5 useIlluminateDatabaseEloquentModel;6

7 class Post extendsModel{8 /**9 * 获取博客文章的评论10 */

11 public functioncomments()12 {13 return $this->hasMany(‘AppComment‘, ‘post_id‘, ‘id‘);14 }15 }

1 <?php2

3 namespace App;4

5 useIlluminateDatabaseEloquentModel;6

7 class Comment extendsModel{8 /**9 * 获取评论对应的博客文章10 */

11 public functionpost()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 functionuser()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 <?php2

3 namespace App;4

5 useIlluminateDatabaseEloquentModel;6

7 class User extendsModel{8 /**9 * 用户角色10 */

11 public functionroles()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();

接着你就可以使用得到的数据了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值