首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

save()之后具有多态关系的Laravel get

在 Laravel 中,多态关系是一种强大的功能,它允许一个模型在多个其他类型的模型上拥有关联。例如,一个 Comment 模型可能关联到 PostVideo 模型。当你在 Laravel 中使用多态关系时,save() 方法之后的 get() 调用可能会涉及到一些特定的概念和操作。

基础概念

多态关系:在数据库中,多态关系允许一个外键关联到多个不同的表。在 Laravel 中,这通常通过一个 morphTo 和多个 morphManymorphOne 关系来实现。

相关优势

  1. 代码复用:可以在不同的模型之间共享相同的关联逻辑。
  2. 灵活性:可以轻松地扩展关联的类型,而不需要修改大量的代码。
  3. 简洁性:通过单一的方法处理多种类型的关联,使得代码更加简洁和易于维护。

类型

Laravel 支持几种多态关系类型:

  • morphTo:定义一个模型可以属于多个其他模型。
  • morphOne / morphMany:定义一个模型可以拥有多个其他模型的实例。
  • morphedByMany / morphtoMany:定义多对多关系。

应用场景

  • 评论系统:一条评论可以属于一篇文章或一个视频。
  • 标签系统:一个标签可以应用于多种不同类型的模型,如文章、视频、用户等。
  • 附件系统:一个文件可以作为多种不同类型内容的附件。

示例代码

假设我们有一个 Comment 模型,它可以关联到 PostVideo 模型。

代码语言:txt
复制
// Comment.php
class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}

// Post.php
class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

// Video.php
class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

当你保存一个新的评论并想要获取所有相关的评论时,你可以这样做:

代码语言:txt
复制
// 创建一个新的评论并关联到一个帖子
$post = Post::find(1);
$comment = new Comment(['body' => '这是一条新评论']);
$post->comments()->save($comment);

// 获取该帖子的所有评论
$allComments = $post->comments()->get();

// 获取该评论所属的所有模型(帖子或视频)
$commentableModels = $comment->commentable;

遇到的问题及解决方法

如果你在调用 save() 方法之后遇到 get() 返回空集合的问题,可能的原因包括:

  1. 外键未正确设置:确保数据库中的外键字段正确配置,并且与多态关系中的字段名匹配。
  2. 模型未正确加载:确保你在调用 save() 方法之前已经正确加载了关联的模型。
  3. 事件监听器干扰:如果有事件监听器在 save() 方法之后修改了数据,可能会影响 get() 的结果。

解决方法:

  • 检查数据库迁移文件,确保外键字段存在并且命名正确。
  • 使用调试工具(如 Laravel 的 dd()dump() 函数)来检查在调用 save() 方法之后模型的状态。
  • 如果使用了事件监听器,确保它们不会意外地修改或删除相关数据。

通过这些步骤,你应该能够诊断并解决在使用多态关系时遇到的 get() 返回空集合的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Laravel 多态关系的表单验证

相信大家使用 Laravel 开发应用的时候都会有评论模块吧,而且我们通常将该模块设计为多态关系(如果你对这个关系还不明白的话,请赶紧打开 Laravel 文档数据库关系章节复习一遍吧!)。...一般来讲有两种方式,而我们通常用的一种是从父模型使用关系写入,比如我们有一个 App\Thread 类,它里面对评论的关系是这样的: class Thread {    public function...: $comment = new Comment(['body' => 'hello']); $thread->comments()->save($comment); 或者这样最直接的方式: $comment...($model->comments()->save($comment)); } 这样写感觉很复杂且不直观对吧?...是不是简单很多,而且这样验证规则还能重用在其它同类多态关系的地方哦。 这样就结束了么?没有! 我们上面的拓展验证规则的写法没有感觉有些粗暴么?是时候规范一下了。

2.2K40
  • 一种 Laravel 中简单设置多态关系模型别名的方式

    作为 Laravel 的重度使用者肯定都对多态关系不陌生,以官方文档为例,文章有标签,视频有标签,那么文章和视频这些模型与标签模型的关系就是多态多对多(Many To Many (Polymorphic...))[1] 如果我们给 ID 为 1 的文章打上两个标签,数据库标签关系表的的存储结果就是这样子: > select * from taggables; +--------+-------------+...思路来源 我尝试跟踪了一遍源码,发现模型中有一个方法 getMorphClass,多态关联的时候,就是用它来取目标对象的类型名称的,默认返回类名: public function getMorphClass...》[2] 我们的目标是使用表名来做为关系类别名,那么在模型中如何获取表名呢,直接使用模型的 getTable 即可,那么整个 trait 的实现如下: app/Traits/UseTableNameAsMorphClass.php...References [1] 多态多对多(Many To Many (Polymorphic)): https://laravel.com/docs/6.x/eloquent-relationships

    2.7K10

    Laravel Eloquent 模型关联关系(下)

    ', function ($query) { $query->where('title', 'like', 'Laravel学院%'); })->get(); 底层执行的 SQL 查询语句如下...('content', 'like', 'Laravel学院%'); })->get(); 无结果过滤 与 has/orHas 方法相对的,还有一对 doesntHave/orDoesntHave 方法...(31); $comment->content = 'Laravel学院致力于提供优质Laravel中文学习资源'; $comment->save(); 再次查看评论模型及对应文章模型数据,可以看到文章模型的更新事件和评论模型的更新时间已经一致了...: 结语 好了,关于关联关系我们就介绍到这里,我们分了三篇的篇幅来介绍 Eloquent 模型的管理关系,回顾一下,主要包含以下内容: 七种关联关系的定义:一对一、一对多、多对多、远层一对多、一对一的多态关联...、一对多的多态关联、多对多的多态关联; 以上关联关系的查询,主要包含两种方式:懒惰式加载和渴求式加载; 基于关联查询构架复杂查询对查询结果进行过滤; 关联模型的更新、插入和删除操作。

    19.6K30

    Laravel学习记录--Model

    - 多态一对 - 多态一对多 - 多态多对 关联查询 继承:ILLuminate\Database\Eloquent\Model model与表名的关系 表名去掉...Model关联 一对一 一对多 渴求式加载 多对多 远层一对多 多态关联 多对多多态关联 一对一 1:1最基本的关联关系 ,如一个User模型关联一个Phone模型,为了定义此关联,我们需在User模型定义一个...使用渴求式加载,即根据预先需求查询出所有数据 为了验证[渴求式加载]的好处,举下列例子 这里用到了Laravel Debugbar 调试 安装方法可参照我的另一个博客 - - - Laravel...学习了一对一多态关联,一对多多态关联相对简单,实际上原理跟一对一多态差不多,只是这里变成了一对多而已 下面举例说明,以评论来说,文章跟评论的关系是一对多,可能我们的系统里面 还会针对某个模块设置评论窗口...学到了这里,理解多态多对多也不是很难了,还是举例说明,文章与标签的关系,多对多这个大家知道,因此我们需要建立文章表与标签表,以及中间表,中间表存放文章与标签表的id使他们建立连接,这是常规套路,但如果我们的系统大一点

    13.6K20

    深入理解 Laravel Eloquent(三)——模型间关系(关联)

    pay: id ... ... user_id User 和 Pay 具有一对多关系,换句话说就是一个 User 可以有多个 Pay,这样的话,只在 Pay 表中存在一个 `user_id` 字段即可。...大家应该也已经注意到了,这里不是简单的 `-> hasOneAccount` 而是 `->hasManyPays()->get()`,为什么呢?...使用跟 hasMany 一样: $tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get(); 这里会得到一个非常复杂的对象...其他关系 Eloquent 还提供 “远层一对多关联”、“多态关联” 和 “多态的多对多关联” 这另外三种用法,经过上面的学习,我们已经掌握了 Eloquent 模型间关系的基本概念和使用方法,剩下的几种不常用的方法就留到我们用到的时候再自己探索吧...我们可以使用一个重要的特性,关系预载入:http://laravel-china.org/docs/eloquent#eager-loading 直接上代码: $users = User::with('

    2.7K30

    orm 系列 之 Eloquent演化历程2

    ,也是laravel中一大亮点Artisan,Artisan是 Laravel 自带的命令行接口名称,此处不做具体的介绍了,有机会再细说的,当我们在命令行中执行php artisan command的时候...tag v1.1.1版本的eloquent, git co v1.1.1 此版本是v4.0.0之前的一个版本,从这以后laravel会以组件的形式组织各个功能,让我们分析下v1.1.1的版本,目前具有哪些功能...本文最后讲下Eloquent中新增的对象之间的关系:多态关系,以下内容摘自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系 表结构 多态关联允许一个模型在单个关联下属于多个不同模型...例如,假设应用用户既可以对文章进行评论也可以对视频进行评论,使用多态关联,你可以在这两种场景下使用单个comments表,首先,让我们看看构建这种关联关系需要的表结构: posts id - integer...参考 [ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系

    2.4K30

    laravel-nestedset:多级无限分类正确姿势

    laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安装要求 安装 开始使用 迁移文件 插入节点 获取节点 删除节点...嵌套集合模型 安装要求 PHP>=5.4 laravel>=4.1 v4.3版本以后支持Laravel-5.5 v4版本支持Laravel-5.2、5.3、5.4 v3版本支持Laravel-5.1 v2...版本支持Laravel-4 强烈建议使用支持事物功能的数据引擎(像MySql的innoDb)来防止可能的数据损坏。...mutator public function setParentAttribute($value) { $this->setParentIdAttribute($value); } 从其他的具有父子关系的模型库迁移...('_rgt'); 设置好你的模型后你只需要修复你的结构树来填充_lft和_rgt字段: MyModel::fixTree(); 关系 Node具有以下功能,他们功能完全且被预加载: Node belongs

    3.5K20

    从0开始做一个审批模块

    所以这个需求方,可以定义为多态的,说的通俗一点就是通过类型和 ID 来决定对象。不过这里我并没有定义为多态,因为应用里面不会出现需求方不确定类型的场景,还是继续沿用 creator_id。...'review', $apply); $apply->markAsRejected(); return \response()->noContent(); } } ‍对多态关系的表单验证不太清楚的可以戳这里...:『Laravel 中多态关系的表单验证[3]』 。...所以在申请列表那一栏里面,展示的是审批通知列表,但是这样的话还是会出现一个问题:当某个申请被审批了之后,通知内容里面的状态是没有变更的,依旧是初始状态,为了解决这个问题,我想过当审批之后,批量更新对应的通知记录...[2] Laravel: https://laravel.com/ [3] Laravel 中多态关系的表单验证: https://learnku.com/articles/12449/form-validation-of-polymorphic-relationships-in-laravel

    1.7K10

    牛哇,PHP这个开发框架真的好香!

    Laravel框架相当于Java的Spring,生态or文档 是很完善的。 之前写Java的mybatis各种sql的和字段的处理,试过php开发之后,确实很快啊。...这个语法是并且 (and) 关系语法这个语法是或者 (or) 关系语法 采取model进行sql增删改查(常用) 9.4 查询 laravel中对数据库开发模型非常重要。...(); $args = func_get_args(); //若$args中有resource类型的参数,则无法区分同一个类的不同实例 $key = md5($className...更高级的用法,更多内容建议看官方文档:https://learnku.com/docs/laravel/7.x/eloquent/7499 总结 laravel框架采取链式查询sql。...更多的sql链式编写查询官方文档,应该是很快可以上手的。 之后还有比laravel更高级的用法lumen框架,就类似Java的mybatis-plus与mybatis。

    26920

    使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁

    Laravel 中 sharedLock 与 lockForUpdate 的区别 sharedLock 对应的是 LOCK IN SHARE MODE lockForUpdate 对应的是 FOR UPDATE...transaction 要更新同一个计数器,如果不使用 lockForUpdate, 会导致两个 transaction 同时读到同一个初始值,然后在应用层逻辑中增加计数之后,提交到数据库中,后者的操作会覆盖掉前者的操作...对应的返回是什么? 会一直 wait 到数据库操作超时。 那么问题来了,Laravel 如何设置数据库操作超时时间?...)->lockForUpdate()->get(); echo 2; sleep(10); }); 你会发现第二个 tinker 窗口中的 get 操作,需要等到第一个 transaction 执行完毕之后...is_null($user_award)) { $amount = $user_award->money * 100; } 事务与锁的关系 事务中涉及的操作都会加上锁?

    2.7K20

    使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁「建议收藏」

    Laravel 中 sharedLock 与 lockForUpdate 的区别 sharedLock 对应的是 LOCK IN SHARE MODE lockForUpdate 对应的是 FOR...transaction 要更新同一个计数器,如果不使用 lockForUpdate, 会导致两个 transaction 同时读到同一个初始值,然后在应用层逻辑中增加计数之后,提交到数据库中,后者的操作会覆盖掉前者的操作...对应的返回是什么? 会一直 wait 到数据库操作超时。 那么问题来了,Laravel 如何设置数据库操作超时时间?...)->lockForUpdate()->get(); echo 2; sleep(10); }); 你会发现第二个 tinker 窗口中的 get 操作,需要等到第一个 transaction 执行完毕之后...is_null($user_award)) { $amount = $user_award->money * 100; } 事务与锁的关系 事务中涉及的操作都会加上锁?

    3K10

    【Laravel系列4.3】模型Eloquent ORM的使用(一)

    ORM 的全称是 Obejct Relational Mapping ,翻译过来就是 对象关系映射 ,再说得直白一点,就是用 面向对象 里的对象来 映射 数据库中的数据。...我们在关系型数据库中,一行数据就可以看成是一个对象,整个表就可以看成是这个对象的列表。这就是非常简单地针对 ORM 的理解。 Java 中的 Hibernate 就是早期非常经典的 ORM 框架。...我们实例化一个 MTest 对象,然后给它的属性赋值,之后直接 save() 就可以了。...在这里比较奇怪的是,我们在实例化和赋值的过程中没有给对象的主键 id 赋值,但是在 save() 之后,id 就有值了,而且是我们新插入的数据 id ,是不是很高大上。...接下来还是几个小操作的演示,源码的分析我们依然放到最后。 关联操作 关联操作是什么意思呢?这个其实和数据库的关联操作是有关系的。

    8.9K20

    nextline函数_Java 中nextLine()方法没有执行直接跳过解决办法

    … c#和java中的方法覆盖——virtual、override、new 多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说...访问修饰符:方法允许被访问的权限范围, 可以是 pub … java中的方法method java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能...框架开发,php框架一般都会讲究优雅链接,比如Laravel,CodeIgniter,ThinkPHP等都是支持这种链接模式的,在服务器配置上也叫作u … cronolog日志切割 1....jerk … mybatis随意sql语句 mybatis的mapper.xml随意sql语句, 不管表之间存不存在关系, 都可以使用, 但注意resultMap中一定要指定查询数据返回的列 或 对象...,做 SEO 随着时间慢慢变长之后,知识会慢慢地积累,之前的问题也会慢慢的都被解答.这里是码动世界为大家整理的有关 SEO 百问百答. 1.

    1.1K20

    跟我一起学Laravel-EloquentORM进阶部分

    定义上述的模型之后,就可以使用User模型获取Phone模型了,当然也可以通过Phone模型获取所属的User了,这就用到了belongsTo方法了 的是,默认情况下之后模型的键可以通过pivot对象进行访问,如果中间表包含了额外的属性,在指定关联关系的时候,需要使用withPivot方法明确的指定列名 return $this->belongsToMany...多对多的多态关联 多对多的关联使用方法morphToMany和morphedByMany,这里就不多废话了。...content', 'like', 'foo%'); })->get(); 预加载 在访问Eloquent模型的时候,默认情况下所有的关联关系都是延迟加载的,在使用的时候才会开始加载,这就造成了需要执行大量的...>orderBy('created_at', 'desc'); }])->get(); 延迟预加载 有时候,在上级模型已经检索出来之后,可能会需要预加载关联数据,可以使用load方法 $books =

    4K50

    3分钟短文:Laravel控制器用法光速入门

    引言 上一章我们介绍了laravel路由注册中的“花拳绣腿”,样样都是那么优雅而实用。路由传递过来的参数,在经过中间件验证和导向之后,应该去控制器接受处理了。...本文用最简单的示例,让你明白laravel中控制器是干什么的,以及怎么用。...仿照restfulapi风格的路由,再定义两条路由地址,用于打开表单,和接收表单提交的数据: Route::get('tasks/create', 'TasksController@create');...('title'); $task->description = Input::get('description'); $task->save(); return redirect...要查看系统内所有已注册的路由,可以使用下面的指令: php artisan route:list 写在最后 本文浅显地介绍了laravel中控制器的使用,最重要的是,resource路由方法默认的骨架代码

    1.5K10

    3分钟短文:Laravel控制器用法光速入门

    引言 上一章我们介绍了laravel路由注册中的“花拳绣腿”,样样都是那么优雅而实用。路由传递过来的参数,在经过中间件验证和导向之后,应该去控制器接受处理了。...本文用最简单的示例,让你明白laravel中控制器是干什么的,以及怎么用。...仿照restfulapi风格的路由,再定义两条路由地址,用于打开表单,和接收表单提交的数据: Route::get('tasks/create', 'TasksController@create');...('title'); $task->description = Input::get('description'); $task->save(); return redirect...要查看系统内所有已注册的路由,可以使用下面的指令: php artisan route:list 写在最后 本文浅显地介绍了laravel中控制器的使用,最重要的是,resource路由方法默认的骨架代码

    1.8K11
    领券