如果关系项不在 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 4:如果通过查询关系存在关系,则选择行

如果路由不在子域中,Laravel 子域路由重定向到 404

如果从数据库中删除,Laravel 中的排队作业是不是会停止?

在 Laravel 中同步一对多关系

Laravel 5 删除一对多关系