数据库查询构建器提供了一个方便的、平滑的接口来创建和运行数据库查询
    可以理解查询构建器就是封装了共用的数据库操作的方法。所以查询构建器的查询结果直接就是键值的结果。

    ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但 是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。

    Laravel自带的Eloquent ORM提供了一个美观、简单的与数据库打交道的ActiveRecord实现,每张数据表都对应一个与该表进行交互的“模型”,模型允许你在表中进行数据查询,以及插入更新删除等操作。
    ORM是基于模型的,查询出的结果是一个类,里面有很多属性,其中attributes:protected和original:protected两个属性都是键值对的数据结果。所以ORM的查询出的结果数据量会很大。每一条数据都对应一个模型。

    查询时间,两种方式的查询效率差不多。查询构建器稍微快点,因为没有实现接口
    但是打印结果的时候,ORM的方式就慢一些。因为查询出的结果会占用的空间会多点。

    用途:
    查询构建器的方式适合作为参数传递,因为占用的空间小,传输会快。
    如果需要对查询出的每条数据进行修改的话,推荐使用orm的方式,orm可以在循环中对查询出的每一个结果直接进行save更改。而DB的方式就得再次使用构建器进行update操作。但是数据很大的话,还是采用db的方式,因为db的结果占用空间小
    注意:
    查询构建器的结果是数组
    orm的结果是对象,如果orm的查询结果作为参数传递的时候,对该对象的修改,会影响原数组,因为PHP对象的传递默认是引用的方式。

    1. <?php
    2. $allBroker = Broker::get();
    3. $allBroker2 = DB::table('Broker')->get();
    4. foreach ($allBroker as $key => $value) {
    5. $value->brokerType = 'gold';
    6. $value->save();
    7. }
    8. foreach ($allBroker2 as $key => $value) {
    9. DB::table('Broker')->where('id', $value->id)->update(['brokerType' => 1]);
    10. }



    20 个 Laravel Eloquent 必备的实用技巧
    https://learnku.com/laravel/t/9991/20-laravel-eloquent-necessary-practical-skills


    优缺点
    相对来说,ORM的缺点就是SQL的优势地方,而优点也是SQL的劣势地方。
    l 优点
    n 方便的使用面向对象,语句清晰
    n 防注入『这个其实不算ORM的核心,因为比如Phalcon的SQL形式写法也可以防注入』
    n 方便动态构造语句,对于不同的表的相同操作采用多态实现更优雅
    n 一定程度方便重构数据层『比如改表名,字段名等』
    n 设置钩子函数
    l 缺点
    n 不太容易处理复杂查询语句
    n 性能较直接用SQL差

    如何选择
    尽量使用ORM,除了含子查询的复杂语句『不过大流量下的网站最好不要写这种复杂SQL』,当然这也只是一个原则,所以反过来说也可以,不过以下几个场景用ORM的好处是很明显的
    l Model对象不确定的时候,使用多态的方式去处理不同实例的相同操作
    l 语句结构不确定的时候,比如根据不同的情况Where子句不一样的时候,采用if的代码结构去控制ORM方法的使用比拼接SQL语句要清晰的多
    l 设置钩子函数,比如分页里面,拿分页数据同时要count数据,那么就可以在Model里面插入这个算count的钩子函数(包括缓存逻辑)