【问题标题】:Delete entries that have a dash in them in laravel删除laravel中包含破折号的条目
【发布时间】:2016-05-08 09:22:57
【问题描述】:

我正在编写一个“运行一次,扔掉”的 laravel 任务,该任务假设对表格进行选择并删除名称中包含破折号的任何条目。

A-R00001
B-R00001
C-R00001
UUA-F4

以上是部分条目的示例。

我知道我可以这样做:Model::where('name', 'like %-%')->delete();

我想知道这是否是正确的方法。它在 postgres 数据库上运行,这不重要。

我见过的其他答案使用疯狂的正则表达式,我认为在这种情况下我不需要它......

想法?

【问题讨论】:

    标签: sql postgresql laravel eloquent laravel-5.2


    【解决方案1】:

    是的,如果您想删除行,这可能是正确的方法,但您应该使用:

    Model::where('name', 'LIKE', '%-%')->delete();
    

    代替:

    Model::where('name', 'like %-%')->delete();
    

    当然,问题是,如果您需要为删除的每一行运行任何额外的任务。如果是这样,您应该首先获取要删除的行并为它们运行额外的任务

    编辑

    如果你想使用 Laravel 事件来做额外的任务,你不能简单地删除所有行。

    你需要运行:

    $models = Model::where('name', 'LIKE', '%-%')->get();
    
    foreach ($models as $model) {
       $model->delete();
    }
    

    为每一行运行删除事件,以便它们可以运行。

    【讨论】:

    • 这些额外的任务应该由 Laravel 的 Eloquent 事件来处理。
    • 你能解释一下Model::where('name', 'LIKE', '%-%')->delete();Model::where('name', 'like %-%')->delete();之间的区别吗?
    【解决方案2】:

    你不能只做简单的 SQL 吗?很常见的数据库管理任务......

    DELETE FROM table WHERE field LIKE '%-%' ;
    

    无需循环或 PHP

    【讨论】:

    • 在 PHP 级别执行此操作可能有好处。 Laravel 的模型可能启用了软删除,因此 delete() 实际上可能不会删除该行,而是将其标记为已删除。模型也可能有删除事件来处理其他清理/通知任务。
    • 当然有,但正如帖子所说,这是一项丢弃任务,因此听起来像是一项数据维护任务。除非设置了软删除,否则对于一次性任务,sql 方式更好
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2011-09-13
    • 2016-12-06
    • 1970-01-01
    • 2011-02-12
    • 2011-08-25
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多