【问题标题】:Get Object and all its relations with Eloquent ORM使用 Eloquent ORM 获取对象及其所有关系
【发布时间】: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


【解决方案1】:

首先,不需要get()。您可以单独使用find()

$post = Book::with('history')->find($id);

不会查询所有记录并在之后进行过滤。它基本上只是为 id 添加一个 WHERE 子句并返回第一个(也是唯一一个)结果。


ModelNotFoundException 仅在您使用 findOrFail() 时才会被抛出。 find() 只会返回 null。所以这就是你想要的:

$post = Book::with('history')->findOrFail($id);

【讨论】:

  • 这很容易。我猜我很困惑,因为在使用get 后我无法使用findOrFail。但是,如果我省略 get 方法,我可以使用 findOrFail,正如您所说,不需要。谢谢!
  • 你不能使用findOrFail(),因为在调用get()之后你有一个没有那个方法的集合......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多