【问题标题】:Laravel : Delete all records that are not in arrayLaravel:删除所有不在数组中的记录
【发布时间】:2015-06-13 04:17:39
【问题描述】:

我的视图中有一个日期选择器日历,基本上我需要将所选日期(我以 ajax 发送)与 BoxDeliveryDate 模型(它只有一个名为“日期”的列)同步。

所以在我的控制器中,如果所选日期尚未存储在数据库中,则只能在我的控制器中编写一个非常好的方法来创建一个新的记录,如下所示:
foreach (Request::get('dates') as $date) {
        $date_formated = date('Y-m-d', strtotime($date));
        BoxDeliveryDate::firstOrCreate(['date'=>$date_formated]);
    }

现在,如果用户在日期选择器中取消选择一个日期,稍后再同步,我需要将其从数据库中删除。

在 Laravel 中有没有很好的方法来做到这一点?换句话说,要删除表中不在我的Request::get('dates') 中的每条记录?

另外,我搜索了一种仅使用一种方法同步所有内容的简单方法,但找不到任何内容。

感谢您的帮助!

【问题讨论】:

  • 考虑使用 Carbon 作为日期和时间,它可以省去很多麻烦!

标签: laravel laravel-5 eloquent


【解决方案1】:

$this->model->whereNotIn('id', $ids)->delete();

【讨论】:

    【解决方案2】:

    如果您要进行批量删除,我强烈建议您使用软删除特征(Laravel 内置)!

    http://laravel.com/docs/4.2/eloquent#soft-deleting

    【讨论】:

    • 为什么?实际上,软删除使批量删除变得更加困难,因为您必须遍历集合并逐个删除模型,或者您必须使用当前时间戳编写更新语句。
    【解决方案3】:

    您可以为此使用whereNotIn()

    BoxDeliveryDate::whereNotIn('date', Request::get('dates'))->delete();
    

    请注意,这不会触发任何模型事件,也不会与软删除一起使用。此外,根据dates 的格式,您可能需要在将数组传递给whereNotIn() 之前对其进行格式化。

    我也认为应该是Request::input('dates'),但有可能两者都有效......

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多