Laravel 模型关联建立与查询

这篇具有很好参考价值的文章主要介绍了Laravel 模型关联建立与查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. Laravel 对象关联关系

1. 对象与数据库表的关联

Laravel有一个强大的数据库工具ORM Eloquent,是每张数据表对应一个Model,对Model的操作就对应数据库的操作,你只用管对model的操作,SQL语句则根据对象模型操作自动生成。
之前写过一篇相关基础介绍的文章:链接: Laravel model 模型用法和部分问题解方法

2. 对象(表)之间的关联关系

在我们代码编写过程中,对象之间有着多种的关联关系;

  1. 一对一 例如:学生有唯一对应的班级
  2. 一对多 例如:班级有很多个学生
    相应的在我们的表中对应的表现就是外键,通过外键与主键相等的方式,进行关系的建立,那么在Laravel中如何进行关联查询呢?

二. 对象关系映射关联关系的建立

1. Model配置关联关系

我们想要在后续的查询中方便进行关联查询,首先我们要在Model中配置相关的关联关系:

//name是关联关系的名称,通常我们使用表名代替,方便记忆
    public function name()
    {
    	//返回我们的关系,使用不同的方法进行关系建立
        return $this->belongsTo('关联对象', '关联外键', '关联主键');
    }

2. 关联关系种类方法

我们这里以班级class,负责人principal,学生student作为参考。

hasOne

班级有一个负责人,那就在班级对象中,新增负责人关联

    public function Principal(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
    	//hasOne( related:关联的对象模型 , foreignKey:'关联字段名')
        return $this->hasOne(Principal::class, 'class_id');
    }

hasMany

一个班级有很多个学生,也就是一对多的关系,新增关联

    public function student(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
    	//hasOne( related:关联的对象模型 , foreignKey:'关联字段名')
        return $this->hasMany(Student::class, 'class_id');
    }

belongsTo

负责人负责一个班级,那就在负责人对象中,可以新增班级关联

    public function class(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
    	//belongsTo( related:关联的对象模型 , foreignKey:'关联字段名')->->withDefault();
        return $this->belongsTo(Class::class, 'principal_id')->withDefault();
    }

withDefault
正常情况下 负责人对应的班级是存在的,如果班级表中的数据删除,那么关联模型就会返回一个null值,避免所属父级被删除导致的异常问题

就是为了解决返回null所带来问题的。

belongsToMany

但是假设学生可以报多个班级,那么学生和班级的关系就会变成多对多的关系,我们通常会使用一个中间的关系表,进行关联

public function class()
    {
        return $this->belongsToMany('目标对象','中间表','本表在中间表外键','目标表在中间表中外键','第三个参数如果对应的不是本表的主键则需要填写,反之不需要');
    }

Laravel 模型关联建立与查询

hasOneThrough

远程关联一对一,比方说一个用户拥有一个账本,账本中存在很多条消费记录,我想从消费记录中获取到该用户的信息,就需要远程一对一

public function record()
    {
        return $this->hasOneThrough('目标对象','中间表','本表在中间表外键','目标表在中间表中外键','第三个参数如果对应的不是本表的主键则需要填写,反之不需要');
    }

hasManyThrough

public function record()
    {
        return $this->hasManyThrough('目标对象名称','中间表','本表在中间表外键','目标表在中间表中外键','当前表与中间表关联字段名称','中间表和目标表关联的字段名称');
    }

三. 对象关系映射关联关系的几种方法

1. with

介绍

with 是一种渴求式预加载,with 更像 sql 中的 join,无论关联的结果中有没有值都会返回,如果没有就会返回一个空

使用方法

//with 中第一个参数就是我们上面建立关系的方法名
$query = Model::with('关系名称')->get();

我们如果想要在进行关联查询时,对其进行筛选,我们也可以在with中写方法:

//查询所有的用户,查询条件:发布过标题中有first的post 
$query = Model::with([
'关系名称' => function ($query) 
{
//对关联表进行筛选,可以用where,orWhere 等
  	$query->where('title', 'like', '%first%');
}
])->get();

如果我们想要携带参数:

//查询所有的用户,查询条件:发布过标题中有first的post 
$query = Model::with([
'关系名称' => function ($query) use ($searchWord) 
{
//对关联表进行筛选,可以用where,orWhere 等
  	$query ->where('title', 'like', '%'.$searchWord.'%');
}
])->get();

2. whereHas

介绍

whereHas只会返回有结果的值,就可以有效避免with中出现空的返回值的情况

使用方法

基础用法与with相似

$query = Model::whereHas('关系名称', function ($query) {
  $query->where('title', 'like', '%first%');
})->get();

但是whereHas可以嵌套

$query = TeacherModel::query()->whereHas(
                'merchant' , function ($query){
                     $query->whereHas(
                            'groups',function($query){
                            $query->where("查询字段","目标值");
                            }
                        );
                }
        )->where('name','like','%'.$searchWord.'%')->get(['id','name']);

四. 写在最后

laravel 中的模型关系是我们在进行多表联查时十分重要的一部分,目前基本的使用可以达到效果,但是感觉并不能十分透彻的理解,等后续在使用的过程中,有了自己的理解再来补充文章来源地址https://www.toymoban.com/news/detail-421031.html

到了这里,关于Laravel 模型关联建立与查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL查询数据之多表(关联)查询

      数据表: 关联查询主要分为:(inner join)交叉关联、(left join)左关联、(right join)右关联 (inner join)交叉关联: 定义:(inner join)交叉关联只返回两个表联结相等的字段的行 语法:select * from 表1 inner join 表2 on 表1.字段号=表2.字段号 比如我要查学生表和成绩表的交叉

    2023年04月08日
    浏览(38)
  • 认识Mybatis的关联关系映射,灵活关联表对象之间的关系

    目录      一、概述 ( 1 )  介绍 ( 2 )  关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件  2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 关联关系映射是指在数据库中,通过定义 表之间的关联关系 ,将多

    2024年02月11日
    浏览(44)
  • 动态sql,关联查询

    1.2.1 sql标签 可以通过sql标签提高sql代码的复用性 定义代码片段 使用代码片段 1.2.2 if标签 进行条件判断,判断成功会把if内部SQL拼接到外部SQL中,否则不拼接 问题:直接使用if会出现多余的where和and、or等 1.2.3 where标签 用于配置条件,会去掉多余的where、and、or

    2024年01月20日
    浏览(45)
  • 关联查询以及动态SQL

    1、多对一映射处理 场景模拟: 查询员工信息以及员工所对应的部门信息 多对一对应对象:即在多的一方的实体类的成员变量中需要加上一的一方的类型 1.1、级联方式处理映射关系 1.2、使用association处理映射关系 1.3、分步查询 ①查询员工信息 ②根据员工所对应的部门id查询

    2023年04月27日
    浏览(37)
  • MyBatis:关联查询

    在 MyBatis:配置文件 文章中,最后介绍了可以使用 select 标签的 resultMap 属性实现关联查询,下面简单示例 首先,先创建 association_role 和 association_user 两张数据表,并建立关联关系 表结构如图: 表信息如图: 在创建 association_user 表时需要添加 associat

    2024年02月05日
    浏览(36)
  • laravel数据库模型蛇形命名自动转换驼峰命名

    2023年6月20日15:10:59 我看了各种方案,但是多多少少都有各种问题 建议使用 GitHub - kirkbushell/eloquence: A drop-in library for certain database functionality in Laravel, that allows for extra features that may never make it into the main project. 安装 composer require kirkbushell/eloquence 添加到 provider 添加 eloquence servi

    2024年02月10日
    浏览(44)
  • sql怎么两个表关联查询

    在 SQL 中,我们可以使用 JOIN 来两个表关联查询。例如,假设有两个表: table1 和 table2 ,并且它们之间有一个关联字段 field1 。你可以使用如下的语句来两个表关联查询: 你也可以使用多种不同的 JOIN 类型来执行不同的关联方式,例如 INNER JOIN 、 LEFT JOIN 或 RIGHT JOIN 。

    2024年02月12日
    浏览(47)
  • Elasticsearch之join关联查询

    目录 一、join总述 1、关系类比 2、使用限制 3、性能问题 二、Mapping 1、举例说明  2、mapping释义 三、插入数据 1、插入父文档 2、插入子文档 四、关联查询 1、has_parent查询(父查子) 3、has_child查询(子查父) 目录 一、join总述 1、关系类比 2、使用限制 3、性能问题 二、Mapp

    2024年02月03日
    浏览(39)
  • MySQL的多表关联查询

    多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 交叉查询就是将多张表的数据没有条件地连接在一起进行展示。 1.1.1 语法 使用交叉查询类别和商品 通过查询结果可以看到,交叉查询其实是一种错误的做法,在查询到的结果集中有大量的错误数据,称交叉

    2024年02月14日
    浏览(37)
  • Mybatis关联查询【附实战案例】

    目录 相关导读 一、Mybatis一对一关联查询 1. 新增持久层接口方法 2. 新增映射文件对应的标签

    2023年04月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包