【问题标题】:Laravel - 2 queries over nothing?Laravel - 2个查询什么都没有?
【发布时间】:2015-11-01 23:01:52
【问题描述】:

大家好,

official doc of Eloquent for Laravel 中,这是更新表的方法:

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

我必须说,我真的不明白。对我来说,这意味着对于一个非常基本的更新,将对数据库进行 2 个查询 - 一个选择,然后一个更新?

谁能解释一下为什么这是一个好的解决方案?

谢谢!

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.1


    【解决方案1】:

    任何抽象都用于复杂的应用程序。代码太简单,你感觉不到它的优势。对象关系映射 (ORM) 用于隐藏操作数据库或运行 SQL 查询的详细信息。

    就像MVC模型一样,不同的层负责不同的领域。

    查看:渲染 HTML

    Controller:逻辑控制,如if .. else ..

    模型:数据访问,如数据修改和持久化。

    控制器层不会处理模型层的工作方式,您只需找到像$flight 这样的对象,然后更改其属性,然后save()。那是自然而整洁的。您的控制器层都是关于对象修改,而不是数据修改。

    通过分离数据和对象,您可以轻松或至少可能更改数据持久性的实现。

    如果某些对象经常更改,您可以将其保存在RedisMemcached 或其他NoSQL 存储中。控制器层的代码无需更改。

    如果某些对象非常大并且不经常修改,您可以考虑使用一些分布式存储,或者使用lazy loading 技术。您的控制器代码也未更改。你只是改变了模型层的实现,上面的代码不会意识到这个变化。

    解耦或分层代码,可以轻松更改任何层的实现。如果您认为编写两行 SQL 查询比 ORM 更快,那么您可能需要体验具有高度需求变化和性能优化的大型项目。

    将实现和使用分开总是好的。

    编辑:

    您可以使用whereupdate 按id 更新。见http://laravel.com/docs/5.1/eloquent#basic-updates

    App\Flight::where('active', 1)
              ->where('destination', 'San Diego')
              ->update(['delayed' => 1]);
    

    【讨论】:

    • 您好,感谢您的回答。实际上,关注点分离对我来说非常清楚——从 laravel 开始,但我不是从编程开始——也不是 mvc 模式。我明白这一点。对于更复杂的查询 - 当然,这很有意义。但是,对于非常简单的查询,它仍然是 1 个不需要的选择。这种类型的简单查询出现在每个应用程序中,到处都是。难道不应该有一种简单的方法来通过 orm 更新数据而不进行不需要的查询吗?阅读您的回复后,我觉得不再需要它,但它仍然困扰着我。
    • 我终于发现你可以使用active record来避免选择。
    • @JeremyBelolo App\Flight::where('id', 1)->update(['name' => 'New Flight Name']).
    【解决方案2】:

    如果您想确保只修改一条有效记录,使用这种方法会有一些好处。

    另一方面,文档中有另一种方式:

    App\Flight::where('active', 1)
              ->where('destination', 'San Diego')
              ->update(['delayed' => 1]);
    

    是否需要确保单个记录修改是您的偏好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2019-03-29
      相关资源
      最近更新 更多