Eloquent提出了很多疑问

4 laravel eloquent

我刚开始玩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
Run Code Online (Sandbox Code Playgroud)

我想表明在一个网格以下信息:blog_id,blog_title,username,和所有类别:

$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();
Run Code Online (Sandbox Code Playgroud)

这会执行5个查询...它们不是有点太多了吗?Fluent用一个更大的查询来使用和加入所有这些表会更好吗?

Séb*_*uld 14

由于各种各样的原因,雄辩地制作大量小型索引查询比做一个大查询要好得多:

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

您实际上并没有注意到它,但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
Run Code Online (Sandbox Code Playgroud)

它们都会导致SQL优化器在引擎盖下执行这些查询:

SELECT a.* WHERE a.id = 1

SELECT b.* WHERE b.id = 1
Run Code Online (Sandbox Code Playgroud)

从那里,根据您的索引,SQL优化器将根据indioces或全表数据执行匹配.Eloquent在做什么?正是那两个查询.你没有通过一个大问题获得任何东西 - 事实上,你正在失去数据可重用性.在所有事情中,更喜欢小型,优化,可重复使用,可缓存的查询到庞大的语句.

  • 非常感谢^^我无法投票赞成你的答案,因为我没有足够的答案,但我检查它已被接受。再次感谢你们俩^^干杯 (2认同)