好吧,我正在为我正在开发的一个项目使用Eloquent ORM,但是它的性能问题困扰着我。当我只使用它自己的方法时,我可以从它的查询日志中看到它创建了很多查询。
我正在尝试从一个主表和4个其他表中获取数据,其中一个与主表一对一相关,其他表则是多对多。Eloquent为它创建了大约6-7个查询,这让我害怕性能问题。然后,我删除了Eloquent的方法,并使用Fluent创建大型查询,使用了大量的连接,这使我失去了代码的可读性和实用性。
我真正需要知道的是:雄辩是否牺牲了性能?我应该坚持使用它,还是只使用流利的?几个大的连接查询和更多的小查询,哪个更好?
发布于 2014-07-02 23:38:05
我将扩展Sebastian的答案。
我也有很多对多的关系,甚至是一对多的关系。
实际上,我已经将Eloquent的编程风格(它看起来更容易)与Fluent结合起来了。请注意,Eloquent是流利的扩展,所以除非你正在做bat查询,否则你不会牺牲。
如果您先使用用户,然后使用一对一或一对多电话模型(一个用户可以有多个电话号码)
你只需要在where()->get(),然后$users->phone ->phone--这将使eloquent为每个ID运行一个select *,这就是使用急切加载( Sebastian提到的,但太短而无法解释)的地方,它预取所有需要的ID并急切加载ID(你可以通过运行查询日志探查器来验证这一点)。
这样做的额外好处是,你可以急切地加载许多这样的关系。
因此,如果你没有正确地使用它,它并不是“雄辩地提供性能打击”的干式解决方案。
下面是一个小的例子来说明我是如何使用eloquent和fluent的:在Book Model中,我定义了一个作用域函数,它是一个关系函数:
public function scopeLicensorStatus($query, $licensor_status)
{
$query->select('book.*')
->leftJoin('licensors as l', 'l.id', '=', 'book.licensor_id')
->where('l.status','=',$licensor_status);
}
$bookData = Book::
->LicensorStatus('active')
->where('book.status','=', 'active')
->whereIN('book.id',$recommendedIds)
->take($limit)
->skip($offset)
->get();
这样做的目的是将Join作为一个函数来执行,并让我将外部的命令链接起来。最后(如果你做toSQL()而不是get()),你将实现一个与原始SQL匹配的查询,然而正如你所看到的,a)如果你希望重用带有其他约束的连接,那么代码是可重用的,b)你不会牺牲速度,因为最终的查询是一个单一的查询(只需要正确地编写它),c)看起来更好和可读性,这就是为什么我们喜欢eloquent。
我希望这个答案能帮助你更深入地了解雄辩
https://stackoverflow.com/questions/24533440
复制相似问题