【问题标题】:Laravel - Repetitive query in blade view - Reducing number of queriesLaravel - 刀片视图中的重复查询 - 减少查询数量
【发布时间】:2016-05-12 11:50:57
【问题描述】:

我有很多关系,当我进行大量查询时,它会降低网站速度,这已成为一个问题。

例如,我正在为所有博客执行一个 foreach 循环并获取创建该博客的用户。

@foreach ($blogs as $blog)
    <a href="{{ route('blog.view', str_slug($blog->title)) }}">{{ $blog->title }}</a>

    {{ $blog->created_at }}

    <a href="{{ viewProfile($blog->user) }}"><{{ $blog->user->username }}/a>

    Last Commenter:
    <a href="{{ viewProfile($blog->lastCommenter()->user) }}">
        {{ $blog->lastCommenter()->user->username }}
    </a>

@endforeach

仅此一项就有超过 50 多个查询。如果有 100 个博客,那么查询的数量就相差甚远。

我怎样才能避免这样做?我已将它存储在此视图中的变量中,但我不想真正将任何 PHP 代码放入刀片文件中。我怎样才能避免这样做?我曾尝试在数据库中使用缓存,但这也对数据库中的缓存表进行了一些查询。我也在使用急切的加载,这很有帮助。但是我怎样才能最好地做这种事情呢?

非常感谢您提前回复。

【问题讨论】:

  • 这就是为什么我尽量远离 ORM。单个 sql 查询将与您尝试实现的相同。
  • @TheDrot,你应该了解它是如何工作的。使用 ORM,您将获得更多可维护和可读的代码。数十个 JOINS 看起来比·App\Book::with('author', 'publisher')->get();··
  • @AlexeyMezenin 我知道它们是如何工作的,是的,您的观点是有效的,但是您的示例仍然执行 3 个查询,并且查询计数随着每个额外的关系而增加,这可能成为许多使用该应用程序的用户的问题。数十个连接可能看起来更丑陋,但我认为当今的每个后端 Web 开发人员都需要对数据库和 SQL 有所了解。
  • @TheDrot,我的观点是:OOP 优于过程,ORM 优于原始查询,框架优于纯 PHP。使用所有这些,您将获得一个更容易维护的应用程序(并且更便宜、更强大等)。但那只是我的个人意见。 )

标签: php laravel caching


【解决方案1】:

这就是所谓的N+1问题。您应该首先学习如何使用Eager loading 并加载关系。然后遍历集合以向用户显示数据。

从文档中急切加载多个关系的示例:

$books = App\Book::with('author', 'publisher')->get();

@Achraf Khouadja 建议的示例和tutorial

$blogs = blog::with('lastCommenter', 'user')->get();

【讨论】:

  • @AchrafKhouadja,对不起?
  • 对不起,这个评论是给他看的,哈哈,这很糟糕,错误的地方,你做得很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2023-03-06
  • 1970-01-01
  • 2023-03-09
  • 2019-10-10
相关资源
最近更新 更多