Eloquent 多态关联
chenxin

解释一下什么时候用create什么时候用save可以吗

JellyBool 回复 @chenxin

看你的具体需求吧。我个人是喜欢在创建一个完整的记录的时候,喜欢 create,要是修改记录中一个或两个字段的时候,我就会使用 save

Addison 回复 @chenxin

引用下 Eloquent: 入门 里的原文,希望有帮助。

  1. 要在数据库中创建一条新记录,只需创建一个新模型实例,并在模型上设置属性和调用 save 方法即可。(但是需要 > 2 行代码实现)

  2. 你也可以使用 create 方法在一行代码上保存一个新模型。被添加的模型实例将会从你的方法中返回。然而,在这样做之前,你需要先在你的模型上指定一个 fillable 或 guarded 属性,因为所有的 Eloquent 模型都有针对批量赋值(Mass-Assignment)做保护。

  3. save 方法也可以用于更新数据库中已经存在的模型。要更新模型,则须先取回模型,再设置任何你希望更新的属性,接着调用 save 方法。

liudong0763

老师 unguard()是什么意思,为什么要用 unguard()

JellyBool 回复 @liudong0763

这是相对于 fillable 来说的,unguard() 就是暂时先运行全部填充。因为这个时候我知道我在干嘛,所以在这种场景之后可以直接全部填充数据

Addison 回复 @JellyBool

我尝试了下,不运行 unguard() 方法也是可以得到期望的结果,但前提是 comment 模型类必须声明

 $fillable=['body'];

你这样使用unguard() 方法,是不是如这里所述的用法?Model-Eloquent 配置信息

// 关闭模型插入或更新操作引发的 「mass assignment」异常
 Eloquent::unguard();
chenxin
$comments=Comment::with('user')->where('discussion_id',$discussion->id)->get();

现在利用多态关联改成

$comments=$discussion->comments;

但是我想用with来预加载减少sql的查询咋么实现

JellyBool 回复 @chenxin
Discussion::with('comments')

这样?

chenxin 回复 @JellyBool

1.这个问题不好解决!多态直接调用了model中的comments方法,没法先预加载,预加载是一个静态方法。
2.我想问一下在blade中,我怎么a标签一个url是返回上一个链接。没找到合适的办法。我不想要

href="{{url('discussions/'.$comment->commentable_id)}}"

这种方式.

chenxin

如果是收藏功能的话,可以收藏帖子,也可以收藏文章,那么建数据表的时候也是多态关联吧??

JellyBool 回复 @chenxin

可以的,就是这样思路

chenxin 回复 @JellyBool

我弄了一下!在tinker下面试了试,发现如果先find文章的记录,然后用favorites找相对应的收藏数据会出现

Illuminate\Database\QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel-community.favoriteables' doesn't exist (SQL: select `favorites`.*, `favoriteables`.`favoriteable_id` as `pivot_favoriteable_id`, `favoriteables`.`favorite_id` as `pivot_favorite_id` from `favorites` inner join `favoriteables` on `favorites`.`id` = `favoriteables`.`favorite_id` where `favoriteables`.`favoriteable_id` = 4 and `favoriteables`.`favoriteable_type` = App\Article)'

但是如果先find收藏记录,然后用favoriteable找寻相应的文章或者帖子则没有问题。。。。

chenxin 回复 @JellyBool

哎!我自己写错了!把morphMany写成了morphToMany.气死了。。。

JellyBool 回复 @chenxin

行,问题解决就好,我刚刚录视频去了

yaoye6262

两张表可以使用多态关联吗?

JellyBool 回复 @yaoye6262

两张表是什么意思?具体可以描述一下需求么

yaoye6262 回复 @JellyBool

一张用户表 一张银行卡表 一对多的关系

yaoye6262 回复 @JellyBool

后续可能还有订单表 现在暂时两个表 可以先用多态关联吗?

JellyBool 回复 @yaoye6262

一个用户有多张银行卡,一个用户有多个订单?

这种就是 一对多 吧?

yaoye6262 回复 @JellyBool

是的 一对多

yaoye6262 回复 @JellyBool

可以用多态关联吗? 还是直接使用一对多关联?

JellyBool 回复 @yaoye6262

我觉得直接一对多好一点吧,因为感觉 order 个 bank account 没有太大的关系

beaplat-61f

一般权限管理中,user跟role是多对多关系,要实现 $user->hasRole($role) 这样的功能,检查用户有没有指定的角色
给定一个$user=User::find(1),$role=Role::find(1)
要看两个model之间有没有关联,怎么实现,我的思路

$user->roles()->where('role_id', $role->id)->get()

还是有其他更好的办法,望不吝赐教

JellyBool 微信公众号

不定期送书,送键盘,送订阅优惠