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

Posted

技术标签:

【中文标题】Laravel 在插入/更新后获取数据【英文标题】:Laravel get data after insert/update 【发布时间】:2022-01-17 01:38:00 【问题描述】:

我有这部分代码:

$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);

现在想返回插入或更新的数据作为响应,但是在google并看到很多帖子后,所有尝试都失败了,我该怎么做?没有最后插入的 id

但返回布尔值:


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

How to get last insert id in Eloquent ORM laravel

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

【问题讨论】:

您将 updatecreate 视为相同,但它们不是 (laravel.com/docs/8.x/eloquent#inserts)。 create 根据需要返回新模型,但 update 根据更新成功返回布尔值。 在更新的情况下,你显然已经有一个$seller,所以不要重新分配它 @BrianThompson 实际上没有。在更新的情况下,当卖家已经存在但没有确认自己的电话号码时,我们让其他人注册。 $seller = Seller::where('tel', '=', $request->tel)->where('confirmed', '=', 1)->first() 我不确定在这个问题的上下文中这意味着什么。问题是您的回复说数据是1,因为这就是update() 在成功时返回的内容。如果您需要确保返回更新后的数据,那么更新方法之后(不将其分配给$seller)您可以在返回之前调用$seller->fresh() 我正在添加一个答案,以便我有更多解​​释空间。我认为您并未遵循所有必需的部分。 【参考方案1】:

你的问题的关键是理解 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】:

这是因为您正在用更新方法的响应覆盖您的 var $sellers。 update() 返回一个布尔值。因此,您不必将返回值分配给 $seller var 来代替更新。

要返回更新后的卖家模型,请在响应中使用 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 嗨!老实说,我并没有真正看你的答案。因为问题很清楚,错误也很明显。所以我们似乎有相似的答案。而且因为相同的代码确实是不必要的,所以我将删除我的代码,但留下我的答案文本。好的?真的没看懂! @BrianThompson 我里面有 fresh() 方法。我把响应json。看看`'data'=> $seller->fresh()], 200)` 无需从您的答案中删除代码。如果您的回答是诚实的,那么我会相信您的话并删除我的评论。我只是怀疑您的代码 sn-p 在与我相同的位置添加了一个空格,但没有进行其他格式更改。 我也没有看到 fresh() 调用,因为 sn-p 水平滚动(至少在我的屏幕上)。这实际上指出我的方法混淆了,打算使用refresh 而不是fresh。您可能想在答案的文本中指出fresh 的用法,以便未来的读者不会像我一样错过它。 @BrainThompson 我更新了。谢谢你的建议! ;-)

以上是关于Laravel 在插入/更新后获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.5 中将数据插入表格并获取电子邮件通知?

laravel 在多行中插入数据,并在一个循环中从 API 获取 [关闭]

如何在 Laravel Eloquent ORM 中获取插入的多行数据

如何在使用 jooq 生成的 dao 插入/更新后获取插入/更新的对象

laravel 8:插入方法在 eloquent 中获取最后一个插入 id(插入方法)

如何在 Eloquent ORM laravel 中获取最后一个插入 ID