上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个很重要的部分叫模型关联,它通过面向对象的方式优雅地把数据表之间的关联关系抽象到了...* 定义一个一对多关联关系,返回值是一个HasMany实例 * * @param string $related * @param string $foreignKey * @param...string $localKey * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function hasMany...\Illuminate\Database\Eloquent\Relations\HasMany 类的实例,Eloquent封装了一组类来处理各种关联,其中 HasMany是继承自 HasOneOrMany...为了阅读方便我们把这几个有继承关系类的构造方法放在一起,看看定义一对多关返回的HasMany实例时都做了什么。
同样,没有指定 $localKey 的话,Eloquent 底层会返回主键 ID: public function getKeyName() { return $this->primaryKey...要定义用户文章之间的一对多关联,可以在 User 模型类中通过 Eloquent 底层提供的 hasMany 方法来实现: public function posts() { return $this...= User::findOrFail(1); $posts = $user->posts; 与 hasOne 返回的是单个模型实例不一样,hasMany 返回的是模型类集合: Eloquent 底层约定...和 hasOne 方法一样,hasMany 方法底层也对如何建立关联关系做了约定,而且 hasMany 方法和 hasOne 方法的签名一样: public function hasMany($related...不过中间表默认只返回关联模型的主键字段,如果要返回额外字段,需要在定义关联关系的时候手动指定,比如如果想要返回时间戳信息,可以这么定义: public function tags() { return
在本篇文章中,我将跟大家一起学习 Eloquent 中最复杂也是最难理解的部分——模型间关系。...Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”(如果只把它当成 Database Abstraction...) { return $this->hasMany('Pay', 'user_id', 'id'); } } 然后,当我们需要用到这种关系的时候,该如何使用呢?...因为这里是 `hasMany`,操作的是一个对象集合。 相应的 belongsTo() 的用法跟上面一对一关系一样: hasMany 一样: $tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get(); 这里会得到一个非常复杂的对象
关联关系 One To One 假设User模型关联了Phone模型,要定义这样一个关联,需要在User模型中定义一个phone方法,该方法返回一个hasOne方法定义的关联 <?...'App\User', 'foreign_key', 'other_key'); } } One To Many 假设有一个帖子,它有很多关联的评论信息,这种情况下应该使用一对多的关联,使用hasMany...likeable会根据该记录的类型返回帖子或者评论。.... */ public function posts() { return $this->hasMany('App\Post'); } 你可以像下面这样查询关联并且添加额外的约束 $user =...查询关系存在性 使用has方法可以基于关系的存在性返回结果 // 检索至少有一个评论的所有帖子...
multipleResults 对象中就包含了我们最终返回的集合对象三....resolveInterface(type) 方法中,对传入的类对象做具体转换图片可以看到 List.class 被转换为 ArrayList.class,接着调用 instantiateClass() 方法,完成空集合的创建...,(划重点)由此可见,**Mybatis** 返回集合类型默认是空集合handlerResult(ResultContext空集合在 handleRowValues() 方法中,处理返回记录,转换为...总结由上经过源码分析,我们知道 Mybatis 返回集合类型默认是空集合,我们在日常开发中,对于 Mybatis 返回集合类型不需要判断是否为 null,直接调用 list.size() > 0 或者其他第三方工具包提供的集合判空方法即可
三、模型关联Laravel框架中的Eloquent ORM提供了方便的模型关联功能,用于定义不同表之间的关联关系。下面是几个常用的模型关联类型。...phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;class User extends Model{ public function...phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;class Post extends Model{ public function...comments() { return $this->hasMany(Comment::class); }}class Comment extends Model{ public...其中,hasMany方法表示一个Post模型拥有多个Comment模型,belongsTo方法表示一个Comment模型属于一个Post模型。多对多关联多对多关联表示两个模型之间存在多对多的关联关系。
四、查询构建器Laravel框架中的Eloquent ORM提供了方便的查询构建器,用于构建复杂的查询语句。下面是一些常用的查询构建器方法。...select方法select方法用于选择需要返回的字段,例如:$users = User::select('name', 'email')->get();上述代码中,只返回用户的姓名和邮箱字段。...总结通过上述文档和示例,我们可以看出Laravel框架中的Eloquent ORM提供了便捷的对象关系映射功能,可以大大简化开发者的数据库操作。...Eloquent ORM提供了大量的方法来操作数据,包括增删改查等,具体可以参考官方文档。...关联关系的定义需要在对应的模型类中定义,例如一对一关联需要在hasOne和belongsTo方法中定义,一对多关联需要在hasMany和belongsTo方法中定义,多对多关联需要在belongsToMany
Relationship with conditions and ordering 这是定义关系的典型方法: public function users() { retrun $this->hasMany...例如,如果您想要某种类型的用户(也是通过电子邮件订购)的特定关系,您可以这样做: public function approvedUsers() { retrun $this->hasMany...withDefault(); } 在此示例中,如果没有作者附加到帖子,则 author()关系将返回空的 App \ Author 模型。...18. update() 方法的执行结果 你有没有想过这段代码究竟返回了什么?...因此,如果您需要检查受影响的行数,则无需再调用任何其他内容 - update()方法将为您返回此数字。 19.
multipleResults 对象中就包含了我们最终返回的集合对象 三....type) 方法中,对传入的类对象做具体转换 image.png 可以看到 List.class 被转换为 ArrayList.class,接着调用 instantiateClass() 方法,完成空集合的创建...,(划重点)由此可见,Mybatis 返回集合类型默认是空集合 • handlerResult(ResultContext空集合 2....总结 由上经过源码分析,我们知道 Mybatis 返回集合类型默认是空集合,我们在日常开发中,对于 Mybatis 返回集合类型不需要判断是否为 null,直接调用 list.size() > 0 或者其他第三方工具包提供的集合判空方法即可
带条件与排序的关联关系 定义关联关系的一般方式: public function users() { return $this->hasMany('App\User'); } 你知道吗?...举个例子,如果你想关联某些类型的用户,同时使用 email 字段排序,你可以这样做: public function approvedUsers() { return $this->hasMany...(); } 在此示例中,如果文字没有作者的信息, author() 会返回一个空的 App\Author 模型对象。...你是否想知道这段代码实际上返回什么?...因此如果你想检查多少行受影响, 你不需要额外调用其他任何内容 -- update() 方法会给你返回此数字。 19.
Eloquent Eloquent是laravel中的orm,采取的是active record的设计模式,里面的对象不仅包括领域逻辑,还包括了数据库操作,但是大家平时使用的时候可能没有探究eloquent...├── Builder.php ├── Model.php └── Relations ├── BelongsTo.php ├── BelongsToMany.php ├── HasMany.php...此时关系处理上主要的逻辑是调用Model的HasOne等表关系的方法,返回Relation的子类,然后通过Relation来处理进而返回数据,这么说可能有点绕,我们下面具体介绍下每个关系的实现,大家可能就理解了...$related; return new HasOne($instance->newQuery(), $this, $foreignKey); } 我们看到当调用Model的hasOne方法后,返回是一个...the comments for the blog post. */ public function comments() { return $this->hasMany
说明:本文主要说明Laravel Eloquent的延迟预加载(Eager Loading),使用延迟预加载来减少MySQL查询次数。同时,会将开发过程中的一些截图和代码黏上去,提高阅读效率。...\Relations\HasMany */ public function shops() { return $this->hasMany(Shop::class...\Collection|\App\Merchant[] $merchant * @property-read \Illuminate\Database\Eloquent\Collection|\App...\Relations\HasMany */ public function products() { return $this->hasMany(Product...预加载查询 (1)嵌套预加载 Eloquent在通过属性访问关联数据时是延迟加载的,就是只有该关联数据只有在通过属性访问它时才会被加载。在查找上层模型时可以通过预加载关联数据,避免N+1问题。
XorY 方法 Eloquent有很多方法是两个方法的组合,实现 “请做X,否则做Y”这样的需求。...带条件以及排序的关联关系模型 通常定义关系模型的方法是这样的 public function users() { return $this->hasMany('App\User'); }...比如说你需要定义一个特定类型的用户的关联关系并且用邮箱信息来排序,那你可以这么做: public function approvedUsers() { return $this->hasMany...模型属性: 时间戳, 附加属性(appends) 等 Eloquent模型有一些“参数”,会以该类的属性形式出现。...) { return $this->belongsTo('App\Author')->withDefault(); } 在这个例子中,在这个帖子下没有关联作者的时候,author()关联关系将返回一个空的
FUNCTION __FUNCTION__魔术常量返回使用它的函数的名称。如果在函数或方法之外使用它,它将返回空字符串。...__CLASS__ __CLASS__魔术常量返回使用它的类的名称。如果在类外使用它,它将返回一个空字符串。...类似地,当在Laravel模型中定义关系时,你可以这样做: namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate...\Database\Eloquent\Relations\HasMany; class User extends Model { public function posts(): HasMany...{ return $this->hasMany(Post::class); } } 在上面的例子中,我们使用::class常量来获取Post模型类的完全限定名,这将给我们
return $this->belongsToMany(User::class); } public function tasks() { return $this->hasMany...(Task::class); }} namespace App; use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent...$this->belongsToMany(Project::class); } public function tasks() { return $this->hasMany...返回的结果是修改了的.... 这就尴尬了,难道是对象集合中的非对象属性不能这样赋值?也不对呀,思来想去决定对对象本身做一个探索,直接在 map 中打印 $userTask : ?...大公告成,可以说很优雅,哈哈,大家可能会问,你这直接返回了没有调用 toArray 啊,数据是怎么合并的怎么转换的?
开始前我们先看一个问题: 你是否曾经在学习 Mybatis 的时候跟我有一样的疑问,什么情况下返回 null,什么时候是空集合,为什么会是这种结果?那么你觉得上述这种回答能说服你嘛?...看完这篇你就知道查询结果为空时候为什么集合会是空集合而不是 NULL,而对象为什么会是 NULL 了。 PS:对过程不感兴趣的可以直接跳到最后看结论。...那么我们看到 DefaultSqlSession#selectList() 方法,先说结论:返回值为空集合而不是 NULL。...只不过 selectList 是直接把 executor.query 从 defaultResultHandler.getResultList() 返回的空集合没有做处理,直接返回。...而返回值为集合对象且查为空时,selectList 会把这个存储结果的 List 对象直接返回,此时这个 List 就是个空集合。
类中我们声明了 user() 方法用于关系用户模型, 所以此处链式调用 user 属性,返回的是一个 App\User 对象实例,其包含 User 模型的所有属性, 因此 email 属性也相应返回数据库内的字段值...同时创建迁移文件: php artisan make:model State --migration 默认在 App\State.php 文件内生成下面的代码: use Illuminate\Database\Eloquent...= new Event; $event->name = "Laravel Hacking and Pizza"; $event->state_id = 41; $event->save(); 注意,hasMany...关联关系,返回的是多个模型的集合,可以后续链式调用集合的所有方法。...写在最后 本文不失简单地介绍了belongsTo和hasMany两个关联关系,这在代码中仅次于hasOne关系, 使用的频次比较高的。而效率也就是根据外键多查询一次SQL的消耗而已。
胖胖的Eloquent Eloquent采用了ActiveRecord的模式,这也让Eloquent招致了好多批评,让我们去看现在Eloquent/Model.php文件, 该文件已经有3500多行,此时的...'author'); } } 上面的代码中,虽然我们使用的type hint表明使用的repository是PostRepositoryInterface,但是方法findActivePosts返回的...有以下几个方案 让findActivePosts返回�Collection,而不是Eloquent\Collection,避免在Repository之外使用Eloquent相关的功能 通过custom...collections方法,返回自定义的collection 下面介绍第二个议题Eager Loading 还是看代码 class FooController { public function...public function posts() { return $this->hasMany(Post::class); } public function getPosts
业务常规的查询逻辑如下: 从redis中获取数据, 有则返回 当第一步redis无数据, 去MySQL查询数据 把第二步查询到的数据写入redis 返回数据 问题分析 redis当然不会有问题, 问题是在第二步的时候...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class BaseModel extends Model {...php namespace App\Models\Database; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database...\Eloquent\Collection; use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; class MysqlCustomBuilder...])) { // 记录日志, 通知xxx // Log::error($e); // 强制返回空集合
Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent 对一对多关系的处理以及在 Laravel Administrator...Eloquent 使得管理和处理这些关系变得简单。...课程信息表 Model * soc_id :主键自增 * soc_name :课程名 * soc_teacher:授课老师 **/ class SobjectInfo extends Eloquent...timestamps = false; /* * 定义一对多关系 */ public function Scoreinfo(){ return $this -> hasMany...s_id :学生信息表(stuinfo)主键 * soc_id :课程信息表(sobjectinfo)主键 * score :分数 */ class ScoreInfo extends Eloquent
领取专属 10元无门槛券
手把手带您无忧上云