在Laravel中出现了两处针对数据库的Builder,一时分不清楚。

Eloquent\Builder

Query\Builder


首先,确认Eloquent\Builder与Query\Builder是否是有继承关系:

1/ 打印两者之间的instanceof关系,发现并没有关系

2/ 查看源码:

Eloquent\Builder的构造器方法中有一个注入参数QueryBuilder

/*** The base query builder instance.** @var \Illuminate\Database\Query\Builder*/
protected $query;/*** Create a new Eloquent query builder instance.** @param  \Illuminate\Database\Query\Builder  $query* @return void*/
public function __construct(QueryBuilder $query)
{$this->query = $query;
}

可见两者之间并没有继承的关系,而是Eloquent\Builder采用了代理模式对Query\Builder进行了操作

/*** Dynamically handle calls into the query instance.** @param  string  $method* @param  array  $parameters* @return mixed*/
public function __call($method, $parameters)
{if ($method === 'macro') {$this->localMacros[$parameters[0]] = $parameters[1];return;}if (isset($this->localMacros[$method])) {array_unshift($parameters, $this);return $this->localMacros[$method](...$parameters);}if (isset(static::$macros[$method])) {if (static::$macros[$method] instanceof Closure) {return call_user_func_array(static::$macros[$method]->bindTo($this, static::class), $parameters);}return call_user_func_array(static::$macros[$method], $parameters);}if (method_exists($this->model, $scope = 'scope'.ucfirst($method))) {return $this->callScope([$this->model, $scope], $parameters);}if (in_array($method, $this->passthru)) {return $this->toBase()->{$method}(...$parameters);}$this->forwardCallTo($this->query, $method, $parameters);return $this;
}

Eloquent\Builder中的__call方法,在最后也将当前类所有未能定位的方法全部forward到Query\Builder执行。


其次,如何使用Eloquent\Builder,又如何使用Query\Builder呢?

Laravel中既提供了实例的使用,也提供了快捷的Facade使用方法。如:

\Illuminate\Support\Facades\DB::table('user'); // --> object(Illuminate\Database\Query\Builder)

UserModel::query(); // --> object(Illuminate\Database\Eloquent\Builder)

可以看出,使用了Facades\DB得到的是Query\Builder,而在UserModel的query方法调用后得到的是Eloquent\Builder。

个人认为:

1/ DB的方法固然方便,但是更多的将table的信息硬编码,导致后期维护工作量大;

2/ Eloquent\Buidler代理了Query\Builder的方法,因此使用上也与DB的使用差别不大。

在日常的操作中,我们更多的是定义了Model操作类。在Mode类中明确指定了表的名称:

/*** The table associated with the model.** @var string*/
protected $table;

所以,更建议采用Model的方式进行操作。


第三,Eloquent\Builder与Query\Builder得到的结果是否一致呢?

/*** Use Eloquent\Builder**/
$eloquentBuilderResult = User::query()->where('name', 'test')->first();
// var_dump($eloquentBuilderResult);
// object(\App\Models\User) {}/*** Use Query\Builder*/
$queryBuilderResult = DB::table('user')->where('name', 'test')->first();
// var_dump($queryBuilderResult);
// object(\stdClass) {}

因为定义的User对象是继承自\Illuminate\Database\Eloquent\Model(abstract),因此,所有的结果也均为User对象类型。在这一点上,与Yii2的ActiveRecord(User::find)对象非常相似。

而Query\Builder是直接对表数据进行操作,未与对象进行绑定映射关系等,所以在最后的结果呈现上,返回了stdClass的结果对象集。

Laravel学习 - Eloquent\Builder与Query\Builder相关推荐

  1. Laravel 学习笔记之 Query Builder 源码解析(下)

    说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程.实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常 ...

  2. Laravel 学习笔记5.3之 Query Builder 源码解析(下)

    2019独角兽企业重金招聘Python工程师标准>>> 说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程.实际上,上一篇聊到了\ ...

  3. laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...

    五.新增.修改.删除操作 在前文中我介绍了如何使用Query Builder(查询构造器)进行数据查询,下面接着介绍如何使用它进行数据的增.删.改操作.同样假设我们有如下用户表(user): 1,新增 ...

  4. Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by

    案例 案例:[Laravel 在文章列表中附带上前10条评论?][1],在获取文章列表时同时把每个文章的前10条评论一同查询出来. 这是典型分区查询案例,需要根据 comments 表中的 post_ ...

  5. Call to undefined method Illuminate\Database\Query\Builder::trashed()

    今天在使用laravel软删除的时候,一直报Call to undefined method Illuminate\Database\Query\Builder::trashed()的错误,查看数据库 ...

  6. 数据库查询构建控件集Active Query Builder 控件

    为什么80%的码农都做不了架构师?>>>    Active Query Builder是一款数据库查询构建控件集,用于Borland Delphi和C++Builder中,通过它, ...

  7. 数据库查询构建控件集Active Query Builder

    2019独角兽企业重金招聘Python工程师标准>>> 关键字:数据库,数据库管理,数据库查询,生成器,控件 Active Query Builder是一款数据库查询构建控件集,用于 ...

  8. Studio 3T 的Query Builder使用

    要求完成: 以age升序,显示id,name,age的查询结果(使用Studio 3T 的Query Builder) 1.原始数据: 2. 3. 4. 5. 6. 7.得到结果 .

  9. PHP利用分组查询groupby,Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy...

    Laravel 5.5 Linux mint 18 PHPStorm 最近刚玩Laravel,手册源码还没来得及看完就跃跃欲试做了个小项目,其中有个需求是分组查询数据库中的一个字段并返回每个分组中的数 ...

  10. 搜索引擎学习(六)Query的子类查询

    Query的子类查询 PS:这是通用代码,下面的子类查询调用到的时候就不再写这部分的具体的实现过程了 /*** 构造IndexSearcher对象** @return* @throws Excepti ...

最新文章

  1. 解决新配置虚拟主机不生效的问题
  2. 设计模式 策略模式
  3. java程序math包没有_java.math包应用
  4. 8月19学习练习[两三个TableView并排显示]
  5. k8s pod里访问不到外部ip_K8S容器网络如何实现通信?
  6. (转)RabbitMQ学习之spring整合发送同步消息
  7. python datasets 下载_frds:金融学术研究数据的Python库
  8. innodb_file_format设置
  9. Java基础篇:什么是线程优先级?
  10. 【数据结构笔记】快速排序(quickSort)和快速选择(findKthLargest)--Python3
  11. The /usr/local/mysql/data directory is not owned by the 'mysql' to '_mysql' user
  12. 实用软件工程(张海藩)课后答案
  13. iOS架构-cocoaPods之Podfile语法(18)
  14. 群晖J3455安装DS3617xs 6.2.3折腾教程
  15. 睡眠监测目前的原理分析
  16. 后盾网原创实战网站建设教程【PS切片+html+div+css+织梦后台...
  17. 全国DNS服务器IP地址【电信、网通、铁通】。
  18. 对接支付宝单笔转账接口
  19. Android 获取唯一Id
  20. 什么是含源一端口网络_二端口网络

热门文章

  1. Pygame Surface对象
  2. 推荐几款基于 Markdown 在线制作简历的网站
  3. 新手小白安装linux系统
  4. 全电动梅赛德斯EQS年底将在曼谷生产下线;麦格纳突破车尾照明技术2023年可投入生产 | 美通企业日报...
  5. layui日期插件样式冲突
  6. 存储系统(一)—— 存储器介绍
  7. Detection物体检测及分类方法总结(RFCN/SSD/RCNN/FastRCNN/FasterRCNN/SPPNet/DPM/OverFeat/YOLO)
  8. Android 实现图文混排
  9. CANopen基本原理及其应用(二)——对象字典和通讯机制
  10. 232串口计算机口电压,如何从PC机RS-232串口获取电源的简单方法详细说明