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

在on子句模型名称中使用多态数据透视表的laravel连接

在 Laravel 中使用多态数据透视表与 on 子句模型名称进行连接涉及到 Eloquent ORM 的高级用法。以下是对这个问题的详细解答:

基础概念

多态关系(Polymorphic Relations): 多态关系允许一个模型关联到多个不同的模型。这在处理多种类型的数据时非常有用,例如评论可以关联到文章、视频或其他任何类型的模型。

数据透视表(Pivot Table): 数据透视表是一种数据库表,用于在两个或多个模型之间建立多对多关系。它通常包含关联模型的外键以及可能的额外字段。

相关优势

  1. 灵活性:多态关系提供了极大的灵活性,允许单一的关系类型关联到多种不同的模型。
  2. 代码复用:通过使用多态关系,可以减少重复代码,提高代码的可维护性。
  3. 扩展性:易于添加新的模型到现有的多态关系中,而无需重构大量代码。

类型与应用场景

类型

  • 多态一对一:一个模型可以关联到一个多种类型的模型。
  • 多态多对多:多个模型可以通过数据透视表关联到多个其他类型的模型。

应用场景

  • 评论系统:评论可以关联到文章、视频等多种内容类型。
  • 标签系统:标签可以应用于多种不同的模型,如文章、产品等。

示例代码

假设我们有一个 Comment 模型,它可以关联到 PostVideo 模型。我们将使用一个数据透视表 commentables 来实现这种多态关系。

数据库迁移

代码语言:txt
复制
Schema::create('commentables', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('comment_id');
    $table->unsignedBigInteger('commentable_id');
    $table->string('commentable_type');
    $table->timestamps();

    $table->foreign('comment_id')->references('id')->on('comments')->onDelete('cascade');
});

模型定义

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

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

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

使用 on 子句进行查询

假设我们需要查询特定类型的评论(例如,关联到 Post 的评论),可以使用 on 子句进行过滤:

代码语言:txt
复制
$posts = Post::with(['comments' => function ($query) {
    $query->where('commentable_type', Post::class);
}])->get();

遇到问题及解决方法

问题:查询时性能低下,特别是在数据量大的情况下。

原因

  • 复杂的连接和过滤条件可能导致数据库查询效率低下。
  • 缺乏适当的索引可能导致查询速度慢。

解决方法

  1. 优化查询:尽量减少不必要的连接和过滤条件。
  2. 添加索引:在 commentable_typecommentable_id 字段上添加索引以提高查询性能。
代码语言:txt
复制
Schema::table('commentables', function (Blueprint $table) {
    $table->index(['commentable_type', 'commentable_id']);
});
  1. 分页处理:对于大量数据的查询,使用分页可以显著提高性能。
代码语言:txt
复制
$posts = Post::with(['comments' => function ($query) {
    $query->where('commentable_type', Post::class);
}])->paginate(10);

通过以上方法,可以有效解决在使用多态数据透视表时可能遇到的性能问题。

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

相关·内容

pivottablejs|在Jupyter中尽情使用数据透视表!

大家好,在之前的很多介绍pandas与Excel的文章中,我们说过「数据透视表」是Excel完胜pandas的一项功能。...Excel下只需要选中数据—>点击插入—>数据透视表即可生成,并且支持字段的拖取实现不同的透视表,非常方便,比如某招聘数据制作地址、学历、薪资的透视表 而在Pandas中制作数据透视表可以使用pivot_table...pivottablejs 现在,我们可以使用pivottablejs,可以让你在Jupyter Notebook中,像操作Excel一样尽情的使用数据透视表!...接下来,只需两行代码,即可轻松将数据透视表和强大的pandas结合起来 from pivottablejs import pivot_ui pivot_ui(df) 就像上面GIF展示的一样,你可以在...Notebook中任意的拖动、筛选来生成不同的透视表,就像在Excel中一样,并且支持多种图表的即时展示 还等什么,用它!

3.8K30
  • Laravel学习记录--Model

    图片 建立多态连接,在Image模型中定义方法并使用morphTo返回结果 morphTo(name,type,id,ownerKey) name:关联关系的名称 ,如不指定默认为关联方法名type...模型中定义方法使用morphedByMany与Article和Image建立多态多对多连接 morphedByMany($related,$name,$table,$foreignPivoteKey,$...relatedPivotKey,$parentKey,$relatedKey) $relate·:关联的模型类 $name:关联的名称,在定义数据库迁移时通过morphs指定的名称一致 $table:中间表名称...,$parentKey,$relatedKey,$inverse) $relate·:关联的模型类 $name:关联的名称,在定义数据库迁移时通过morphs指定的名称一致 $table:中间表名称,默认为...在调用save方法向Phone模型插入值 这里Eloquent自动在phones表中添加了uid字段,并插入正确的值 使用saveMany添加多个值 $user = \App\Muser::find

    13.6K20

    阿里Druid数据连接池在SSM框架中的配置使用

    Druid数据连接池简介 首先可以参考阿里在GitHub给出的一些说明: Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。...性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。...Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。...在mysql中通常设置为SELECT 'X' validationQuery:SELECT 'x' #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行...ApplicationContext.xml中配置阿里数据连接池Druid <!

    2.7K70

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

    作为 Laravel 的重度使用者肯定都对多态关系不陌生,以官方文档为例,文章有标签,视频有标签,那么文章和视频这些模型与标签模型的关系就是多态多对多(Many To Many (Polymorphic...思路来源 我尝试跟踪了一遍源码,发现模型中有一个方法 getMorphClass,多态关联的时候,就是用它来取目标对象的类型名称的,默认返回类名: public function getMorphClass...实现目标 我们有两个选择去实现它: 1.创建一个模型基类覆盖这个方法,所有的模型都来集成它即可;2.创建一个 trait,在需要的模型中引入它。...》[2] 我们的目标是使用表名来做为关系类别名,那么在模型中如何获取表名呢,直接使用模型的 getTable 即可,那么整个 trait 的实现如下: app/Traits/UseTableNameAsMorphClass.php...,或者你的表名与模型名不太一致,那么,你只需要修改 trait 中 getMorphClass 的实现即可,我个人的习惯是模型名就是表名的单数,不带前缀。

    2.7K10

    记录下关于SQL Server的东西

    数据库透视转换:所谓透视转换(pivoting)就是把数据从行的状态转化为列的状态,当然对应的还有逆透视转换(unpivoting):就是数据从列的状态转化为行的状态。...case表达式,如果事先不知道要扩展的值,而且希望从数据中查询出这些值,就得使用动态SQL来构建查询字符串,并进行查询。... server 2005以后便可使用T_SQL中的pivot来做透视转换: PIVOT运算符也是在查询的from子句的上下文中执行操作。...它对某个源表或者表表达式进行操作、透视数据,再返回一个结果表。...,比如可以根据不同的逻辑进行(delete,update,insert); Merge是基于连接语义的,在merge子句中指定目标表的名称,在using子句中指定源表的名称,通过on子句来定义和并条件。

    1.3K10

    orm 系列 之 Eloquent演化历程2

    └── Migrator.php 此处有个新的知识点,也是laravel中一大亮点Artisan,Artisan是 Laravel 自带的命令行接口名称,此处不做具体的介绍了,有机会再细说的,...的功能,主要是对数据库表操作sql的建模 此处Connectors是之前没有介绍过的,Connectors是在f917efa中第一次加入的,我们看下到底做了什么,其目录结构是: src/Illuminate...本文最后讲下Eloquent中新增的对象之间的关系:多态关系,以下内容摘自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系 表结构 多态关联允许一个模型在单个关联下属于多个不同模型...例如,假设应用用户既可以对文章进行评论也可以对视频进行评论,使用多态关联,你可以在这两种场景下使用单个comments表,首先,让我们看看构建这种关联关系需要的表结构: posts id - integer...文件,其最初是在f851607中加入的,我们来看下Manager中的内容。

    2.4K30

    软件测试|深入理解SQL CROSS JOIN:交叉连接

    CROSS JOINCROSS JOIN的语法非常简单,它只需在FROM子句中列出要连接的表,并使用CROSS JOIN关键字进行连接。...数据透视:在数据透视和交叉分析中,可以使用CROSS JOIN来创建所有可能的组合,并在结果集中进行聚合操作。...在使用CROSS JOIN时,务必确保结果集不会无限增长,可以使用LIMIT子句限制返回的行数,或者仔细筛选结果以减少返回的数据量。...总结CROSS JOIN是SQL查询中的一种连接方式,它返回两个或多个表中的所有可能组合。它通常用于生成笛卡尔积、数据透视和生成测试数据等情况。但需要谨慎使用,确保结果集不会无限增长。...适时地结合LIMIT子句或其他条件来控制返回的数据量,以确保查询性能和系统资源的合理利用。在实际应用中,根据具体情况灵活使用CROSS JOIN,能够帮助我们更好地处理数据并获得需要的结果。

    52220

    Laravel Eloquent 模型关联关系(下)

    从性能上来说,渴求式加载更优,因为它会提前从数据库一次性查询所有关联数据,而懒惰式加载在每次查询动态属性的时候才会去执行查询,会多次连接数据库,性能上差一些(数据库操作主要开销在数据库连接上,所以在开发过程中如果想优化性能...,尽量减少频繁连接数据库)。...,如果返回的文章结果是列表的话,需要遍历获取作者信息,假设要循环 N 次的话,加上文章模型本身的获取,总共需要进行 N + 1 次查询,而 PHP 对数据库的连接是短连接,每次都要重新连接数据库,所以从性能角度考虑不建议使用这种方式...注:实际开发中为了提高查询性能,我们往往是在 posts 表中冗余提供一个 comments_count 字段,每新增一条评论,该字段值加 1,查询的时候直接取该字段即可,从而提高查询的性能。...所以不管模型实例有多少个,关联结果只会查询一次,加上模型本身查询总共是两次查询,在列表查询时,大大减少了对数据库的连接查询次数,因而有更好的性能表现,推荐使用。

    19.6K30

    SQL基础查询方法

    此列表指定结果集有三列,并且每一列都具有 Product 表中相关列的名称、数据类型和大小。因为 FROM 子句仅指定了一个基表,所以 SELECT 语句中的所有列名都引用该表中的列。...WHERE 子句指定出条件:在 Product 表中,只有 ListPrice 列中的值大于 40的产品的产品ID、名称以及标价¨G0G在SELECT关键字之后所列出的列名(ProductID、Name...此列表指定结果集有三列,并且每一列都具有Product表中相关列的名称、数据类型和大小。因为FROM子句仅指定了一个基表,所以SELECT语句中的所有列名都引用该表中的列。...FROM子句仅列出Product这一个表,该表用来检索数据。WHERE子句指定出条件:在Product表中,只有ListPrice列中的值大于40,该值所在的行才符合 SELECT 语句的要求。...4.4 FROM子句 在每一个要从表或视图中检索数据的 SELCET 语句中,都需要使用 FROM 子句。使用 FROM 子句可以: 列出选择列表和 WHERE 子句中所引用的列所在的表和视图。

    4.3K10

    通过 Laravel 查询构建器实现复杂的查询语句

    你一定有过这样的经历,从数据库获取指定查询结果后,以主键 ID 值为键,以某个字段值为值构建关联数组,以前,你可能不得不遍历查询结果构建数组才能解决这样的问题,在 Laravel 中,我们只需在查询构建器上调用...WHERE 查询也可以使用子查询,对应的方法是 whereSub,但是子查询的效率不如连接查询高,所以我们下面来探讨连接查询在查询构建器中的使用。...连接查询 相关术语 在介绍连接查询之前,你需要对 SQL 的几种连接查询有所了解,SQL 连接查询通常分为以下几种类型: 内连接:使用比较运算符进行表间的比较,查询与连接条件匹配的数据,可细分为等值连接和不等连接...然后为该数据表创建一个模型类: php artisan make:model Post 接下来,我们为这个模型类创建一个模型工厂: php artisan make:factory PostFactory...: php artisan make:seeder PostsTableSeeder 在 database/seeds 目录下新生成的填充类 PostsTableSeeder 中,调用模型工厂填充数据表

    30.2K20

    3分钟短文 | Laravel复杂SQL超多WHERE子句,本地作用域你没用过

    引言 使用框架就是为了方便把注意力集中在逻辑上,而不用关心与数据库操作的方方面面。...Laravel提供的 eloquent orm 使用面向对象的方式封装了PDO数据库操作,使用起来非常方便,对于复杂的SQL操作也游刃有余。...今天说一说,复杂的超多的WHERE子句,怎么写起来较为优雅。 学习时间 比如对于业务逻辑中,User模型在筛选查询的时候有非常多的限制条件,类似下面这样的: ?...Laravel 的软删除功能就是利用此特性从数据库中获取 “未删除”的模型。 你可以编写你自己的全局作用域,很简单、方便的为每个模型查询都加上约束条件。看官方给出的示例: ?...就是在对应的 Eloquent 模型方法前添加 scope 前缀,在模型中构造如下的作用域方法: ?

    2.8K10

    Java进阶学习路线图「建议收藏」

    子类对象的实例化过程、方法的重写和重载、final关键字、抽象类、接口、 继承的优点和缺点。 对象的多态性:子类和父类之间的转换、父类纸箱子类的引用、抽象类和接口在多态中的应 用、多态优点。...SQL语句 数据库的创建,表的创建,修改,删除,查询,索引的创建,主从表的建立,数据控制授权和回收,事务控制,查询语句以及运算符的详解,sql中的函数使用。...多表连接和子查询 等值和非等值连接,外连接,自连接;交叉连接,自然连接,using子句连接,完全外连接和左右外连接,子查询使用以及注意事项。...触发器、存储过程 触发器和存储过程使用场合, 通过实例进行详解。 数据库设计优化 WHERE子句中的连接顺序,选择最有效率的表名顺序,SELECT子句中避免使用 ‘ * ‘ 计算记录条数等等。...OA工作流技术JBPM 工作流是什么、JBPM介绍、JBPM的主要用法、各类节点的用法、任务各种分派方式、JBPM的整体架构原理、工作流定义模型分析、运行期工作流实例模型分析、数据库表模型分析、流程定义管理

    94330

    Java学习路线图分析

    子类对象的实例化过程、方法的重写和重载、final关键字、抽象类、接口、继承的优点和缺点。 对象的多态性:子类和父类之间的转换、父类纸箱子类的引用、抽象类和接口在多态中的应用、多态优点。...SQL语句 数据库的创建,表的创建,修改,删除,查询,索引的创建,主从表的建立,数据控制授权和回收,事务控制,查询语句以及运算符的详解,sql中的函数使用。...多表连接和子查询 等值和非等值连接,外连接,自连接;交叉连接,自然连接,using子句连接,完全外连接和左右外连接,子查询使用以及注意事项。...触发器、存储过程 触发器和存储过程使用场合, 通过实例进行详解。 数据库设计优化 WHERE子句中的连接顺序,选择最有效率的表名顺序,SELECT子句中避免使用 ‘ * ‘ 计算记录条数等等。...OA工作流技术JBPM 工作流是什么、JBPM介绍、JBPM的主要用法、各类节点的用法、任务各种分派方式、JBPM的整体架构原理、工作流定义模型分析、运行期工作流实例模型分析、数据库表模型分析、流程定义管理

    1.4K101

    Java学习路线图分析

    子类对象的实例化过程、方法的重写和重载、final关键字、抽象类、接口、继承的优点和缺点。 对象的多态性:子类和父类之间的转换、父类纸箱子类的引用、抽象类和接口在多态中的应用、多态优点。...SQL语句 数据库的创建,表的创建,修改,删除,查询,索引的创建,主从表的建立,数据控制授权和回收,事务控制,查询语句以及运算符的详解,sql中的函数使用。...多表连接和子查询 等值和非等值连接,外连接,自连接;交叉连接,自然连接,using子句连接,完全外连接和左右外连接,子查询使用以及注意事项。...触发器、存储过程 触发器和存储过程使用场合, 通过实例进行详解。 数据库设计优化 WHERE子句中的连接顺序,选择最有效率的表名顺序,SELECT子句中避免使用 ‘ * ‘ 计算记录条数等等。...OA工作流技术JBPM 工作流是什么、JBPM介绍、JBPM的主要用法、各类节点的用法、任务各种分派方式、JBPM的整体架构原理、工作流定义模型分析、运行期工作流实例模型分析、数据库表模型分析、流程定义管理

    1.2K30

    Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

    Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent 对一对多关系的处理以及在 Laravel Administrator...您的数据库可能是彼此相关的。比方,一篇博客文章可能有很多评论,或者一个订单与下订单的用户相关。Eloquent 使得管理和处理这些关系变得简单。...Laravel 提供了四种类型的关系: –一对一 –一对多 –多对多 – 多态关系 一对多 一个一对多关系的样例是一篇博客文章有很多评论或者一个课程有的多次分数信息等。...> 通过以上步骤的处理。表与表之间的一对多关系已确立, 以下将介绍在Laravel Administrato 后台中的实现 下拉列表查询、绑定等应用 中多次使用到 “学生姓名”、“课程名”,尽管他们存储在不同的表中,但因为我们之前在 Model中已建立了它们之间的 一对多关系,因此我们能够自由搭配组合 效果图例如以下: 10个Laravel4

    2.1K40

    程序员零基础速成SQL

    熟练使用SQL的前提一定是先了解你的数据库表,现在花点时间看看这四张表的字段信息(描述每个字段的意义)和数据样例(给出部分真实数据),关于业务中用到表的结构可以找数据小哥拿。...by&聚合函数&having子句) 分组查询实现了类似excel中数据透视表的功能,可以帮助我们对数据进行分层汇总,而我们对分层后的数据进行统计的时候需要用到聚合函数(也就是平均值、求和、最大值和最小值等...where子句是对原始表做筛选的 having子句是对分层汇总之后的结果做筛选的 回顾我们上一篇讲过的例子:在限定学生表学号小于等于6的一批学生中,查询每门课的最高成绩(最高成绩低于70分的课程不显示...这和excel中的数据透视表一致。 2. 聚合函数 ? 聚合函数 3. having子句 和where子句一致,只需注意是对聚合后的结果作限制。...待连接的表信息 2.内连接 内连接即通过对某个字段进行等值匹配从而将两个表联合起来,比方说我们需要获取两张表中同一个学号对应的姓名和成绩,使用的就是inner join,结果如下: ?

    1.5K10
    领券