【问题标题】:Set Laravel Eloquent model's to eager load by default将 Laravel Eloquent 模型默认设置为预加载
【发布时间】:2016-02-20 14:33:27
【问题描述】:

Laravel 的 eloquent 模型默认设置为延迟加载。问题是它对数据库进行了大量查询,尤其是在高流量期间,laravel 应用程序崩溃,而在 Yii 1 上构建的类似应用程序没有问题。

安装 Laravel 的调试栏后,问题是每次页面加载时都会进行太多查询。下一步是查询优化。我一直按照 Laravel 文档中的指示使用急切加载,但仍然有太多查询。

我想知道是否有办法在开发环境中将 Eloquent 设置为仅“急切加载”。这样当页面加载失败时,识别问题会更容易。

【问题讨论】:

  • 您已请求有关设置仅开发人员急切加载的方法的信息,但听起来您的问题是“查询太多”。由于您报告了应用程序崩溃,因此了解错误输出或日志显示的崩溃原因也会很有帮助。

标签: php laravel


【解决方案1】:

您可以直接在模型上将默认关系设置为“急切加载”:

Class MyModel extends Model {
  protected $with = ['relation'];
}

【讨论】:

【解决方案2】:

高数据库负载的解决方案是Cache

正确缓存可以在高流量期间为您提供令人难以置信的性能,因为它将常见的数据库查询减少到零,并将它们重定向到更快的 RAM 查询。

启用Route Caching 也会提高性能:

php artisan route:cache

编辑:

正如Fx32 指出的那样,您应该确保您需要 Eloquent,并且最好直接对数据库进行相同的查询,加入您需要的表并进行单个查询而不是很多:

缓存不是修复不良数据库查询的好方法。 Eloquent 很棒,但通常最好用 一些加入。不要只是抨击你的数据库然后扔掉所有的 导致缓存,因为它会引入新问题。如果您使用 case 不是平面 CRUD API,ActiveRecord 模式可能不是 无论如何最好的解决方案。如果您仔细选择并加入来自 DB,并且想加快检索此类项目,缓存可以 帮助。

【讨论】:

  • 我将缓存作为优化过程的下一步。在开始缓存之前,我想确保所有查询都尽可能优化。
  • 缓存不是修复错误数据库查询的好方法。 Eloquent 很棒,但通常最好用一些连接编写正确的查询。不要只是猛烈抨击您的数据库,然后将所有结果放入缓存中,因为它会引入新问题。如果您的用例不是平面 CRUD API,那么 ActiveRecord 模式可能不是最好的解决方案。如果您仔细选择并加入数据库中的结果,并希望加快此类项目的检索速度,缓存可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 2014-12-05
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2017-01-16
  • 1970-01-01
相关资源
最近更新 更多