【发布时间】:2015-09-27 16:47:28
【问题描述】:
我有两个数据库表。一种用于保存基本数据,一种用于保存数据的历史记录。例如:我有一张桌子books 和一张桌子book_data
现在,在 books 表中,我有一个类似 sales 的列。这是今天这本书产生的销售量。在 book_data 中,我还保存了 sales 数字,但另外添加了一个日期进行计数。例如,我可以看到这本书在过去 7 天的销量。
要通过 ID 获取图书,我正在执行以下操作
try {
$book = Book::findOrFail($id);
return [
'status' => 'success',
'data' => $post
];
} catch (ModelNotFoundException $e) {
return response()->json([
'status' => 'error',
'data' => 'No book with this id found'
], 400);
}
但是现在,我还想获得销售的“历史”。这意味着,当我选择一本书时,我还想从我的book_data 表中获取所有相关值。因此,当我保存了过去 4 天的数据后,我还想在回复中显示这些数据。
在我的Book 模型类中我有
public function history()
{
return $this->hasMany('App\\Models\\BookData');
}
这段代码我已经写好了,基本可以用……
public function show($id)
{
try {
$post = Book::with('history')->get()->find($id);
return [
'status' => 'success',
'data' => $post
];
} catch (ModelNotFoundException $e) {
return response()->json([
'status' => 'error',
'data' => 'No post with this id found'
], 400);
}
}
...但是,我对这个解决方案有多个问题。
1st:这对性能来说是不是很糟糕,因为我首先获取所有对象及其关系,然后然后我按 id 过滤它?
第二:当我传递一个不存在的 ID 时,不会抛出 ModelNotFoundException。
那么,我将如何以最好的方式实现这一目标?兼顾性能和易读性和最佳案例。
【问题讨论】:
-
不需要
get()。$post = Book::with('history')->find($id); -
谢谢。这至少缩小了代码。但是,我仍然收到所有帖子,并且 THEN 正在过滤,不是吗?我的问题,在这种情况下不会持续存在对性能不利吗?我的
ModelNotFoundException也不会被解雇
标签: php laravel eloquent lumen