默认情况下,将Laravel Eloquent模型设置为急切加载

eli*_*xir 21 php laravel

Laravel的雄辩模型默认设置为延迟加载.问题在于它对数据库进行了大量查询,特别是在高流量时,laravel应用程序崩溃了,而在Yii 1上构建的类似应用程序没有问题.

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

我想知道是否有办法在开发环境中将Eloquent设置为"Eager Load".这样,当页面无法加载时,识别问题会更容易.

小智 46

您可以直接在模型上将默认关系设置为"eager load":

Class MyModel extends Model {
  protected $with = ['relation'];
}
Run Code Online (Sandbox Code Playgroud)

  • 作为参考 - 这是相关 API 文档的链接 - https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html#property_with (2认同)

vpe*_*osa 1

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

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

启用路由缓存也会提高性能:

php artisan route:cache
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Fx32所指出的,您应该确保您需要 Eloquent,并且直接对数据库进行相同的查询、连接您需要的表并进行单个查询而不是多个查询不是更好:

缓存并不是一个修复错误数据库查询的好解决方案。Eloquent 很棒,但通常最好是通过一些连接编写正确的查询。不要只是猛击数据库,然后将所有结果扔到缓存中,因为这会引入新问题。如果您的用例不是平面 CRUD API,那么 ActiveRecord 模式可能不是最佳解决方案。如果您仔细选择并连接数据库中的结果,并且希望加快此类项目的检索速度,则缓存可以提供帮助。

  • 缓存并不是一个修复错误数据库查询的好解决方案。Eloquent 很棒,但通常最好是通过一些连接编写正确的查询。不要只是猛击数据库,然后将所有结果扔到缓存中,因为这会引入新问题。如果您的用例不是平面 CRUD API,那么 ActiveRecord 模式可能不是最佳解决方案。如果您仔细选择并连接数据库中的结果,并且希望加快此类项目的检索速度,则缓存可以提供帮助。 (3认同)