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
,但我想要所有数据。
【问题讨论】:
您将update
和 create
视为相同,但它们不是 (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 插入/更新后获取插入/更新的对象