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)}"

这种方式.

liujun 回复 chenxin

一对多不需要预加载(个人理解);
href里面写命名route会比较解耦(个人理解)

foxriver123 回复 chenxin

你需要的是load方法!

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()

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

zhouchang2017

老师,我现在有一个article表,一个user表,一个comment表,comment表中保存了from_uid(评论回复人)to_uid(评论被回复人),a_id(article文章id)。article表中保存了u_id(用户id),我想通过文章查询出所有评论以及评论对应的from_uid,与to_uid
目前在文章模型下建立1对多关系,可以拿到文章下的所有评论和评论用户id,现在的问题就是如何把评论用户id 拿到user表中对应的用户名。

JellyBool 回复 zhouchang2017

在 Comment model 文件中声明关系就好了,类似这样:

public function user(){
  return $this->belongsTo(User::class,'from_uid');
}

如果能自己定义字段的话,不要使用 u_ida_id 这种字段名吧

solgh

现在用多态实现了 收藏文章和帖子的功能但是,如果要获取用户收藏的所有文章或者帖子,这就懵逼了。

JellyBool 回复 solgh

为啥会懵逼呢,你同样是声明关系就好了啊,跟 User 的关系

扬扬的小天地

如果post 和 lesson默认不是用id作为主键的 怎么设置多态关联呢

JellyBool 回复 扬扬的小天地

你在定义关系的时候指定字段就好了

siwei1

请问多态关联如何插入插入数据,往评论表插入视频表或者文章表的评论?

siwei1

抱歉看了视频发现讲的有,打扰了,是我没认真看视频的结果

Flourishing

看到科比的那一刻我震惊了 身为多年LeBron James球迷的我 以前经常和别人意见不合…@JellyBool