【问题标题】:Laravel get data after insert/updateLaravel 在插入/更新后获取数据
【发布时间】: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()
  • 我正在添加一个答案,以便我有更多解​​释空间。我认为您并未遵循所有必需的部分。

标签: php laravel


【解决方案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 我更新了。谢谢你的建议! ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2018-04-06
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多