我刚开始玩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_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();
这会执行5个查询...它们不是太多了吗?使用Fluent
并将所有这些表加入1个更大的查询会更好吗?
答案 0 :(得分:13)
出于各种各样的原因,雄辩地制作大量小型索引查询比做一个大查询要好得多:
JOIN
(以及其他类似条款),这样可以轻松缓存您实际上没有注意到它,但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优化器将根据indioces或全表数据执行匹配。 Eloquent在做什么?正是那两个查询。你没有通过一个大问题获得任何东西 - 事实上,你正在失去数据可重用性。在所有事情中,更喜欢小型,优化,可重复使用,可缓存的查询到庞大的陈述。