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

Laravel Eloquent 模型关联关系(下)

Eloquent 模型上进行关联查询主要分为两种方式,一种是懒惰式加载(动态属性),一种是渴求式加载(通过with方法)。...基于关联查询过滤模型实例 有结果过滤 有的时候,可能需要根据关联查询结果来过滤查询结果,比如我们想要获取所有发布过文章用户,可以这么做: $users = User::has('posts')->get...(1); 这样就可以嵌套获取到 profile 表记录信息: 这里会涉及到三个 SQL 查询: select * from `posts` where `posts`....author 属性时,就会返回如下默认空对象了: 特性其实应用了设计模式中空对象模式,好处是在代码里可以为不同情况编写一致性代码。...对于那些已存在标签记录,我们可以通过更高效方法与文章进行关联关系绑定和解除,这个方法就是 sync,调用方法时只需传入刚创建/更新后文章标签对应 ID 值,至于哪些之前不存在关联需要绑定,哪些存在关联需要解除

19.5K30

Laravel学习记录--Model

普通渴求是加载 渴求是加载多个关联关系 嵌套渴求式加载 渴求式加载指定字段 带条件约束渴求式加载 懒惰式渴求式加载 当以属性方式访问Eloquent关联关系时候,关联关系数据是[懒惰式加载]因为都是用到时候才执行查询...渴求式加载多个关联关系 有时候你需要在单个操作中渴求式加载多个不同关联关系,要实现这一功能,只需添加参数到with方法即可 ,以逗号分割 如,查询文章作者即所在栏目 嵌套渴求式加载 要使用嵌套渴求式加载关联关系...`tagtable_type` = 'App\Tag' 关联查询 实际上前面提到渴求式加载与懒惰式加载归结于关联查询,这里将关联查询补充完整 当我们以动态属性方式去访问关联关系时为懒惰式加载 如...,你可能希望根据存在关联对结果进行限制,如,获取有电话号码用户,为了实现这个功能 可以通过has()方法,将建立关系方法名传递给has即可 如 public function show(){...当获取模型记录时,你可能需要根据不存在关联对结果进行限制,如获取没有电话号码用户记录,为了实现这个功能你可以使用doesntHave,并传递关联方法 如 public function show

13.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

Laravel5.7 Eloquent ORM快速入门详解

定义模型 我们从创建一个 Eloquent 模型开始,模型类通常位于 app 目录下,你可以将其放在其他可以被 composer.json 文件自动加载地方。...需要注意是,通过 firstOrNew 方法返回模型实例并没有持久化到数据库中,你还需要调用 save 方法手动持久化: // 通过属性获取航班, 如果不存在则创建......$flight = App\Flight::firstOrCreate(['name' = 'Flight 10']); // 通过name获取航班,如果不存在则通过name和delayed属性创建...$flight = App\Flight::firstOrCreate( ['name' = 'Flight 10'], ['delayed' = 1] ); // 通过属性获取航班, 如果不存在初始化一个新实例...$flight = App\Flight::firstOrNew(['name' = 'Flight 10']); // 通过name获取,如果不存在则通过name和delayed属性创建新实例..

15K41

通过 Laravel Eloquent 模型实现简单增删改查操作

「ActiveRecord」是 ORM 一种实现模式,Eloquent 则是 Laravel「ActiveRecord」。...一个 Eloquent 模型类映射一张数据表,通过模型类提供方法,你可以获取其映射数据表所有记录,可以获取单条记录,还可以创建、更新和删除对应数据表记录,而这一切都不需要你编写任何 SQL 语句...H:i:s,你还可以通过 $dateFormat 属性来自定义时间戳格式,属性值通过 PHP date() 函数进行解析,所以原则上支持 date 函数支持所有语法格式,比如将时间设置为 Unix...: $user = User::findOrFail(111); 如果 id=111 记录在 users 数据表中不存在,就会返回 404 响应: ?...同样,Eloquent 为我们提供了快捷更新方法 updateOrCreate,方法首先会根据传入参数对模型对应记录进行更新,如果发现对应记录不存在,则会将更新数据作为初始数据插入数据库,并保存(

7.9K20

通过 Laravel Eloquent 模型实现批量赋值和软删除

每次这么做得崩溃掉,到时候我们控制器类里面可能会遍布这种设置代码,Laravel 号称优雅就是打脸了。所以这个时候,批量赋值就粉墨登场了,批量赋值就是为我们解决这个问题。...更新模型 如果是更新模型类,可以通过批量赋值方式实现,只需在获取模型类后使用 fill 方法批量填充属性即可: $post = Post::findOrFail(11); $post->fill($...注:你可以修改这个默认约定 deleted_at 字段,但何必费这个劲呢,除非你是从其它系统迁移过来,原来表结构已经存在了,这时候可以通过再模型类中设置静态属性 DELETED_AT 来自定义软删除字段...'); } 此时再查询 id=32 记录,已经不存在了,报 404 异常。...在某些场景下,你可能只需要获取被软删除记录,这可以通过 onlyTrashed 方法来实现: $post = Post::onlyTrashed()->where('views', 0)->get()

2.3K10

orm 系列 之 Eloquent使用2

,从这个model出发,我们可能想要知道Book是在哪个表中,这个时候,我们可以设置$table属性,同时,我们想要设置主键及其类型,我们就设置$primaryKey,$keyType,同时,我们可能还想要指定数据库连接...$book->id; } ); 我们通过save就可以完成insert操作,此处有几个tricky方法,首先是我们Model中不存在title这些字段,那是怎么设置呢?...,我们此处来看下,all方法执行,all在Model中是不存在,那怎么调用呢?...查询和聚合 Eloquent提供了丰富查询方式,通过前面的__call方法分析,我们知道,这些最终调用都是Eloquent/Builder方法,where方法不例外,where其最简单形式如下:...key和Modelattribute对应,Eloquent方法是直接将属性存储为一个$attributes数组,然后由用户自己根据字段名进行获取,但是,其实这也会有个问题,就是一旦字段名更改了,我们必须要去更改所有直接使用字段名地方

53841

Laravel Eloquent 模型关联关系详解(上)

可能注意到了我们在定义关联关系时,仅仅指定了模型类名,并没有指定通过哪些数据表字段建立关联,这并不是说 Laravel 神通广大,能知过去未来之事,而是因为 Eloquent 对此做了默认约定。...建立相对关联关系 通常我们都是通过 User 模型获取 UserProfile 模型,但是有时候我们可能需要反过来通过 UserProfile 反查所属 User 模型,Eloquent 底层为我们提供了相应...可以,Eloquent 为我们提供了 with 方法,我们将需要查询关联关系动态属性(关联方法名)传入方法,并将其链接到 Eloquent 模型原有的查询中,就可以一次完成关联查询,加上模型自身查询...: $post = Post::findOrFail(1); $tags = $post->tags; 返回是个模型集合: 当然,你可以通过前面提到渴求式加载方式获取标签数据: $post =...建立相对关联关系 与之前关联关系一样,多对多关联支持建立相对关联关系,而且由于多对多双方是平等不存在谁归属谁问题,所以建立相对关联方法都是一样,我们可以在 Tag 模型中通过 belongsToMany

9.8K40

Laravel学习笔记(四)——模型,更安全数据存取

前言 如果你是一个从没用接触过框架新手,你在进行数据库操作时候可能会创建数据库链接,然后进行数据操作,最后关闭数据库连接。...看了接下来Laravel模型使用之后你就会爱上LaravelEloquent ORM模型,这也是我直接介绍模型而不讲解其他数据库操作原因。...Eloquent ORM Laravel Eloquent ORM 提供了漂亮、简洁 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应「模型」用来与表交互。...如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false 模型获取 要对数据进行操作第一步是获取操作对象。...,你不需要考虑数据库连接与断开,不需要知道SQL语句,你只需要按照Eloquent ORM提供方法进行对应操作即可。

1.7K00

Laravel学习笔记(四)——模型,更安全数据存取

前言 如果你是一个从没用接触过框架新手,你在进行数据库操作时候可能会创建数据库链接,然后进行数据操作,最后关闭数据库连接。...看了接下来Laravel模型使用之后你就会爱上LaravelEloquent ORM模型,这也是我直接介绍模型而不讲解其他数据库操作原因。...Eloquent ORM Laravel Eloquent ORM 提供了漂亮、简洁 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应「模型」用来与表交互。...如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false 模型获取 要对数据进行操作第一步是获取操作对象。...,你不需要考虑数据库连接与断开,不需要知道SQL语句,你只需要按照Eloquent ORM提供方法进行对应操作即可。

2K00

Laravel源码分析之模型关联

动态属性加载关联模型 上面我们定义了三种使用频次比较高模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来。...当作为属性访问 Eloquent 关联时,关联数据是「懒加载。...意味着在你第一次访问属性时,才会加载关联数据。不过当查询父模型时,Eloquent 可以「预加载」关联数据。预加载避免了 N + 1 查询问题。...,接下来通过 getEager方法获取所有的关联模型组成集合,再通过关联类里定义match方法把外键值等于父模型主键值关联模型组织成集合设置到父模型 $relations属性中接下来用到了这些预加载关联模型时都是从...还有一些我认为使用场景没那么多多态关联、嵌套加载那些我并没有梳理,并且它们底层实现都差不多,区别就是每个关联类型有自己关联约束、匹配规则,有兴趣读者自己去看一下吧。

9.5K10

路由使用进阶(二)

{task},然后默认以参数值作为资源 ID 在底层通过 Eloquent 查询获取对应模型实例,并将结果传递到闭包函数或控制器方法中。...路由模型绑定默认将传入 {task} 参数值作为模型主键 ID 进行 Eloquent 查询,你可以自定义查询字段,这可以通过在模型类中重写 getRouteKeyName() 来实现: <?...}', function (\App\Models\Task $task) { dd($task); }); 注:如果路由模型绑定对应匹配记录不存在,将自动返回 404 响应。...}); 这样,当我们访问一些不存在路由,比如 http://blog.test/test/111,就会执行兜底路由中处理逻辑,而不是返回 404 响应了。...在 Laravel功能通过内置 throttle 中间件来实现,中间件接收两个参数,第一个是次数上限,第二个是指定时间段(单位:分钟): Route::middleware('throttle

8.5K40

竟然有人质疑我还在用Laravel开发?别忘了PHP是最好语言。(2)模型工厂类

模型类目录 由于压倒性社区需求,现在默认 Laravel 框架包含一个 app/Models 目录。我们希望你喜欢 Eloquent 新家!...所有相关生成器命令均已更新,假定模型存在于 app/Models 目录(如果存在)。如果目录不存在,则框架将假定你模型应放置在 app 目录。...Eloquent 模型工厂 已完全重写为基于类工厂,并有完美的关联支持。例如 Laravel UserFactory 是这样写: <?...除此之外,你可以给你 Eloquent 模型工厂添加任意你需要工具类。...例如,你 User 模型 有个 suspended 属性,现在你想修改它一个默认属性值,你可以使用基类工厂类 state 方法来完成。方法名字可以随意设置,毕竟这是个很典型 PHP 方法。

2.7K41

竟然有人质疑我还在用Laravel开发?别忘了PHP是最好语言。

模型类目录 由于压倒性社区需求,现在默认 Laravel 框架包含一个 app/Models 目录。我们希望你喜欢 Eloquent 新家!...所有相关生成器命令均已更新,假定模型存在于 app/Models 目录(如果存在)。如果目录不存在,则框架将假定你模型应放置在 app 目录。...Eloquent 模型工厂 已完全重写为基于类工厂,并有完美的关联支持。例如 Laravel UserFactory 是这样写: <?...除此之外,你可以给你 Eloquent 模型工厂添加任意你需要工具类。...例如,你 User 模型 有个 suspended 属性,现在你想修改它一个默认属性值,你可以使用基类工厂类 state 方法来完成。方法名字可以随意设置,毕竟这是个很典型 PHP 方法。

2.4K60

跟我一起学Laravel-EloquentORM高级部分

软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口类,接口只有一个方法apply,在方法中增加查询需要约束...可以使用$visible指定会被序列化白名单 <?...,使用makeVisible方法 return $user->makeVisible('attribute')->toArray(); 为json追加值 有时需要在json中追加一些数据库中不存在字段...Mutators 在Eloquent模型中,Accessor和Mutator可以用来对模型属性进行处理,比如我们希望存储到表中密码字段要经过加密才行,我们可以使用Laravel加密工具自动对它进行加密...模型$casts属性提供了一种非常简便方式转换属性为常见数据类型,在模型中,使用$casts属性定义一个数组,数组key为要转换属性名称,value为转换数据类型,当前支持integer

1.2K40

Laravel6.0.4中将添加计划任务事件方法步骤

让我们来看看这个版本中一些亮点新特性: 首先,在 TestResponse 类中添加了一个 assertJsonPath() 断言,对于在 JSON 响应中使用针对嵌套属性点符号断言值,这个断言非常方便..., 'This is my comment', ]); 接着,不论生成器类是否有全局/本地宏,为了便于断言,向 Eloquent 生成器添加三个新访问方法: $builder- hasMacro...name); $builder- getGlobalMacro($name); $builder- hasGlobalMacro($name); 向 BelongsToMany 关联添加另一个访问方法来获取中间表列...Laravel 5.8 完整发行说明可在 Github v6 changelog 中找到: Laravel v6.0.4 版本 新增 添加了 TestResponse::assertJsonPath(...0/false 禁用加密成为可能 (#29985) 在 validate dimensions 中允许 symfony 文件实例 (#30009) 使用自定义配置创建存储模拟数据 (#29999) 仅当语言环境有条件地存在

1.7K21

基于独立 Laravel Eloquent 组件编写 ORM 模型类

下载 Eloquent ORM 相关扩展包 Eloquent ORM 作为 Laravel 框架自带 ORM 实现,还可以在 Laravel 框架之外作为独立 ORM 组件使用。...模型类全局可用(为了编写 Eloquent 模型类,如果只是使用 Laravel 提供数据库查询构建器功能,则不需要这些操作)。...Post.php 和 Album.php 中,它们继承了 Eloquent ORM 模型类基类 Model,这样就可以使用 Eloquent 模型类支持属性和方法。...这里,我们通过设置 $timestamps 属性为 false 表示禁用 Eloquent 模型类自动维护时间字段机制。...注:本篇教程源码可以在 Github 获取:https://github.com/nonfu/master-laravel-code/tree/v0.9/practice/blog 小结 至此,我们就完成了

1.9K10

Laravel5.2之模型关联预加载

说明:本文主要说明Laravel Eloquent延迟预加载(Eager Loading),使用延迟预加载来减少MySQL查询次数。同时,会将开发过程中一些截图和代码黏上去,提高阅读效率。...: composer require barryvdh/laravel-debugbar --dev composer require barryvdh/laravel-ide-helper --dev...预加载查询 (1)嵌套加载 Eloquent在通过属性访问关联数据时是延迟加载,就是只有关联数据只有在通过属性访问它时才会被加载。在查找上层模型时可以通过预加载关联数据,避免N+1问题。...all() method. // $shops = $this->shop->all(); //通过`点`语法嵌套加载,多种关联就写对应关联方法 //Shop这个Model...(2)预加载条件限制 还可以对预加载进行条件限制,如对products进行预先排序,代码很好修改,只需: //app/Repository/Eloquent/ShopRepository public

2.5K41
领券