【发布时间】: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。使用所有这些,您将获得一个更容易维护的应用程序(并且更便宜、更强大等)。但那只是我的个人意见。 )