首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该使用Eloquent ORM还是使用Fluent创建大型连接?

我应该使用Eloquent ORM还是使用Fluent创建大型连接?
EN

Stack Overflow用户
提问于 2014-07-02 22:14:19
回答 1查看 894关注 0票数 1

好吧,我正在为我正在开发的一个项目使用Eloquent ORM,但是它的性能问题困扰着我。当我只使用它自己的方法时,我可以从它的查询日志中看到它创建了很多查询。

我正在尝试从一个主表和4个其他表中获取数据,其中一个与主表一对一相关,其他表则是多对多。Eloquent为它创建了大约6-7个查询,这让我害怕性能问题。然后,我删除了Eloquent的方法,并使用Fluent创建大型查询,使用了大量的连接,这使我失去了代码的可读性和实用性。

我真正需要知道的是:雄辩是否牺牲了性能?我应该坚持使用它,还是只使用流利的?几个大的连接查询和更多的小查询,哪个更好?

EN

回答 1

Stack Overflow用户

发布于 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中,我定义了一个作用域函数,它是一个关系函数:

代码语言:javascript
运行
复制
   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。

我希望这个答案能帮助你更深入地了解雄辩

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24533440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档