首页 > 解决方案 > 在 laravel 中,我可以在控制器中使用访问器还是有更好的方法来做我想做的事情?

问题描述

上下文: 假设我有 3 个表:流派、书籍、作者,每本书都有一个流派和作者。

我想要发生的是返回一个流派列表,其中包含所有与作者相关的书籍。基本上,按类型对书籍进行分组并包括书籍作者。这就是我正在做的事情。

Genre->with(['books' => function($q) { $query->with('authors'); }]);

我遇到的问题是速度,因为我有很多书,而这个数字的两倍是作者的数量。不包含作者时速度还可以,包含时增加大约 4 秒,这不好,因为我只需要作者的名字 - 有时当本书有多个作者时只有一个作者。

我正在考虑在 Books 模型中创建一个访问器,以获取与其相关的一位作者的姓名。我仍在弄清楚如何做以及如何在控制器中附加该访问器,因为我不想使用受保护的 $appends,因为它并不总是需要。

您认为使用访问器更好还是有更好的方法来做我想做的事情?

标签: laraveleloquent

解决方案


您可以调整作者关系以始终只返回一位作者(根据需要修改 orderBy 子句)。

$genre = Genre->with(['books.authors' => function($query) { 
    $query->orderBy('name')->limit(1); 
}])->first();

在获取作者时,您可以假设第一个条目就是您需要的条目。

$genre->books->each(function (Book $book) {
    $book->title; 
    $book->authors->first()->name; 
});

要提高性能,请确保您的外键已编入索引。


推荐阅读