laravel - 在 laravel 中,我可以在控制器中使用访问器还是有更好的方法来做我想做的事情?
问题描述
上下文: 假设我有 3 个表:流派、书籍、作者,每本书都有一个流派和作者。
我想要发生的是返回一个流派列表,其中包含所有与作者相关的书籍。基本上,按类型对书籍进行分组并包括书籍作者。这就是我正在做的事情。
Genre->with(['books' => function($q) { $query->with('authors'); }]);
我遇到的问题是速度,因为我有很多书,而这个数字的两倍是作者的数量。不包含作者时速度还可以,包含时增加大约 4 秒,这不好,因为我只需要作者的名字 - 有时当本书有多个作者时只有一个作者。
我正在考虑在 Books 模型中创建一个访问器,以获取与其相关的一位作者的姓名。我仍在弄清楚如何做以及如何在控制器中附加该访问器,因为我不想使用受保护的 $appends,因为它并不总是需要。
您认为使用访问器更好还是有更好的方法来做我想做的事情?
解决方案
您可以调整作者关系以始终只返回一位作者(根据需要修改 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;
});
要提高性能,请确保您的外键已编入索引。
推荐阅读
- python - 在 python 中使用逆字典简化代码
- r - 增加折线长度 r sf
- django - Django:测试 LoginView 抛出 AssertionError
- sql - SQL 联接而不是 UNION
- gridview - 如何访问 Yii2 GridView ActionColumn 中的行号?
- java - 递归函数倒数4-> 0,然后倒数0> 4,如何停止倒数
- amazon-web-services - 如何从 S3 预签名 URL (Amazon Feed API) 下载 Feed 处理报告
- c# - 从“WinRT.IInspectable”到“System.Collections.Generic.IEnumerable`1[Windows.Storage.IStorageFile]”的无效转换
- reactjs - 错误:使用地图反应时,对象作为 React 子项无效
- kubernetes - 将 Kubernetes Ingress 暴露给 LAN 计算机