【问题标题】:Eloquent makes a lot of queriesEloquent 做了很多查询
【发布时间】:2013-05-29 21:55:22
【问题描述】:

我刚开始使用 Laravel 4 和 Eloquent。我有一个博客表和许多其他相关表:

blog <- main info about the blog record
blog_lang <- translations for each blog record
blog_categories <- name speaks for itself
blog_categories_lang <- translations for blog categories titles
blog_to_categories <- pivot table between blog and blog_categories

blog hasMany blog_lang.
blog_categories hasMany blog_categories_lang
blog belongsToMany blog_categories

我想在一个网格中显示以下信息:blog_idblog_titleusername 和所有类别:

$data['blogs'] = Blog::with(array(
  'translations' => function ($q) {
    $q->where('lang_id', '=', 1);
  },
  'user', 
  'categories', 
  'categories.translations' => function ($q) {
    $q->where('lang_id', '=', 1);
  }
))->get();

这会执行 5 个查询...是不是有点太多了?使用Fluent 并使用 1 个更大的查询连接所有这些表会更好吗?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    出于多种原因,进行大量小型索引查询比进行大型查询要好得多:

    • MySQL 不必为每个查询在临时内存中加载多个表,并且可以在查询之间重复使用它们
    • SQL 优化器将在每个查询中更快地运行
    • 它允许您缓存结果,而不必从数据中丢弃JOINs(和其他类似的子句),这使得缓存变得容易

    您实际上并没有注意到它,但 SQL 优化器采用的路径在以下查询之间是相同的:

    SELECT a.*, b.* FROM a INNER JOIN b ON (a.id=b.id) WHERE a.id = 1
    
    SELECT a.*, b.* FROM a, b WHERE a.id = b.id AND a.id = 1
    

    它们都将导致 SQL 优化器在后台执行这些查询:

    SELECT a.* WHERE a.id = 1
    
    SELECT b.* WHERE b.id = 1
    

    然后,根据您的索引,SQL 优化器将根据索引或完整表数据执行匹配。雄辩在做什么?正是这两个查询。一个大查询并没有带来任何好处——事实上,你正在失去数据的可重用性。总而言之,比起庞大的语句,更喜欢小型、优化、可重用、可缓存的查询。

    【讨论】:

    • 为了扩展您的答案...一个巨大的连接查询还将在除 belongsTo 或 hasOne 关系之外的所有关系中提供冗余列/行,因为您将需要每个关系中最深的链接一条记录 - 讨厌!
    • 非常感谢 ^^ 我无法投票赞成您的答案,因为我没有足够的答案,但我检查它是否已接受。再次感谢你们两个^^干杯
    猜你喜欢
    • 2016-06-26
    • 2021-03-02
    • 2020-12-29
    • 1970-01-01
    • 2017-07-30
    • 2021-05-12
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多