如果关系项不在 Laravel 的请求中,则删除它
Posted
技术标签:
【中文标题】如果关系项不在 Laravel 的请求中,则删除它【英文标题】:Deleting a relational item if it's not in the request in Laravel 【发布时间】:2021-10-01 05:38:44 【问题描述】:我在 Laravel 中有一个引用,其中表单具有添加和删除按钮(表单转发器)。我的问题是,如果我在更新报价时删除了一个项目,它不会删除链接到数据库中报价的项目,这些项目不是保存请求的一部分,只是将项目存储在数据库中。这是我在编辑表单时在保存时运行的查询:
foreach (request('quoteItems') as $quoteItem => $item)
$assignedItem = QuoteItems::where('id',$quoteItem)->first();
$assignedItem->id = $item['id'];
$assignedItem->price = $item['price'];
$assignedItem->cost = $item['cost'];
if (QuoteItems::where('quote_id', $quote->id)->where('id', $item['id']))
$assignedItem->save();
else
QuoteItems::where('quote_id', $id)->delete();
我知道这可以通过使用数据透视方法来解决,但是数据透视的问题是同一个外键项(在这种情况下是 QuoteItem)不能在引号中添加两次,这是我绝对需要能够做到的.我不明白我的查询有什么问题,因为理论上它应该删除不在请求中的项目。更新保存正常,但删除的项目不会删除。
如果有人可以在这里帮助我,将不胜感激。
【问题讨论】:
【参考方案1】:我相信您想删除不在请求中的报价项目。
所以你可能想做这样的事情:
foreach (request('quoteItems') as $quoteItem => $item)
$assignedItem = QuoteItems::where('id',$quoteItem)->first();
$assignedItem->id = $item['id'];
$assignedItem->price = $item['price'];
$assignedItem->cost = $item['cost'];
$assignedItem->save();
QuoteItems::where('quote_id', $quote->id)
->whereNotIn('id', array_keys(request('quoteItems')))
->get()
->each
->delete();
【讨论】:
这似乎工作得很好。我设法解决了它,但您的解决方案更优雅。谢谢!以上是关于如果关系项不在 Laravel 的请求中,则删除它的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 比较 Ajax 数组中的值,如果不在表中,则删除它们
如果路由不在子域中,Laravel 子域路由重定向到 404