Laravel在插入/更新后获取数据。

3

I have this part of code:

$seller = Seller::where('tel', '=', $request->tel)->where('confirmed', '=', 1)->first();

if($seller){
    $seller = Seller::where('tel',  $request->tel)->update($input); //update
    return response()->json(['message'=>'Seller Updated successfully!', 'data'=> $seller], 200);
} else {
    $seller = Seller::create($input); //create
    return response()->json(['message'=>'Seller created successfully!', 'data'=> $seller], 200);
}

现在想在响应中返回插入或更新的数据,但是在查看了很多帖子之后,所有尝试都失败了,我该怎么办?而且不能使用上次插入的id。

但是只返回布尔值:

{
    "message": "Seller updated successfully!",
    "data": 1
}

如何在Laravel Eloquent ORM中获取最后插入的ID

大多数主题想要返回id,但我想要所有数据。


你把 updatecreate 当成相同的操作,但它们并不一样(https://laravel.com/docs/8.x/eloquent#inserts)。`create` 返回新建的模型,正如你所期望的那样,但是 update 返回一个基于更新成功与否的布尔值。 - Brian Thompson
在更新的情况下,您显然已经有了一个 $seller,所以不要重新分配它。 - Brian Thompson
@BrianThompson 不是的。在更新情况下,如果卖家已经存在但未确认自己的电话号码,我们会让其他人注册它。$seller = Seller::where('tel', '=', $request->tel)->where('confirmed', '=', 1)->first() - Jack The Baker
在这个问题的背景下,我不确定那意味着什么。问题是,您的响应显示数据为1,因为这是update()成功时返回的值。如果您需要确保返回更新后的数据,则可以在更新方法(不将其分配给$seller调用 $seller->fresh(),然后再将其返回。 - Brian Thompson
@BrianThompson 实际上我想在响应中返回创建或更新的数据,这就是全部。我已经测试了fresh()但是返回错误。 - Jack The Baker
1
我正在添加一个答案,这样我就有更多的空间来解释。我认为你没有遵循所有必需的部分。 - Brian Thompson
3个回答

3
你的问题的关键在于了解 3 个 Eloquent 方法。
- `create()` - 返回插入的模型实例。 - `update()` - 根据更新语句的成功与否返回布尔值 (0 或 1)。 - `refresh()` - 通过重新查询数据库刷新模型实例。
如下完整示例所示,你需要区别对待 `create()` 和 `update()`,因为它们返回不同的结果。
对于 `create()`,你可以保留原样。但是对于 `update()`,需要修改以避免重新分配 `$seller` 变量。
这将停止任何错误,但将返回旧数据。为了返回新数据,你需要刷新模型 (`refresh()`)。
$seller = Seller::where('tel', '=', $request->tel)->where('confirmed', '=', 1)->first();

if ($seller){
    // DO NOT reassign since update() returns boolean
    Seller::where('tel',  $request->tel)->update($input); //update
    
    $seller->refresh(); // Refresh it here
    return response()->json(['message'=>'Seller Updated successfully!', 'data'=> $seller], 200);
} else {
    // This one is good since create() returns newly created model.
    $seller = Seller::create($input); //create
    return response()->json(['message'=>'Seller created successfully!', 'data'=> $seller], 200);
}

2
这是因为您正在用更新方法的响应覆盖了变量$sellers。而update()返回一个布尔值。因此,在更新的地方不需要将返回值分配给$ seller变量。
要返回更新后的销售模型,请在响应中使用fresh()方法。$seller->fresh()
$seller = Seller::where('tel', '=', $request->tel)->where('confirmed', '=', 1)->first();

if ($seller){
    Seller::where('tel',  $request->tel)->update($input); //update
    return response()->json([
        'message' => 'Seller Updated successfully!', 
        'data'=> $seller->fresh()
      ], 200);
} else {
    $seller = Seller::create($input); //create
    return response()->json(['message' => 'Seller created successfully!', 'data'=> $seller], 200);
}

@BrianThompson 你好!老实说,我并没有仔细看你的回答。因为问题很清楚,错误也很明显。所以我们的答案似乎是相似的。而且因为相同的代码真的是不必要的,我会删除我的代码但保留我的答案文本。好吗?我真的没懂! - Maik Lowrey
@BrianThompson 我在里面有一个fresh()方法。我把它放到了响应的json中。看一下 'data'=> $seller->fresh()], 200) - Maik Lowrey
1
不需要从您的答案中删除代码。如果您的回答是诚实的,那么我会相信您并删除我的评论。对我来说,只是有点可疑,因为您的代码片段在与我相同的位置添加了一个空格,但没有进行其他格式更改。 - Brian Thompson
1
我也没有看到fresh()的调用,因为代码片段在我的屏幕上是水平滚动的。这实际上指出了我的方法混淆了,我本来想使用refresh而不是fresh。你可能想在你的答案文本中指出fresh的用法,以便未来的读者不会像我一样错过它。 - Brian Thompson
@BrainThompson 我已经更新了。感谢你的建议!;-) - Maik Lowrey

0

在我的情况下 $user = tap(User::where('id', $id))->update(['name' => $name]);。现在,您可以返回用户:return $user->first();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接