繁体   English   中英

Laravel,无法更新软删除的值

[英]Laravel, Can't update a soft-deleted value

我的数据库中有以下值:

id - name - created_at - updated_at - deleted_at
------------------------------------------------
1  - John - 2018-11-11 - 2018-11-11 -  (NULL)
2  - John - 2018-11-11 - 2018-11-11 -  2018-11-11

如果我使用数据表(Yajra)搜索“ John”,我只会看到id=1的John,因为我正在使用软删除。 我的模型是这样的:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class MyModel extends Model
{
    use SoftDeletes;

    protected $fillable = ['name'];

    protected $dates = ['deleted_at'];
}

当我删除(销毁)注册表时,它会在deleted_at放置一个正确的日期。 但是,当我要编辑(更新) John ,验证器给我的错误是该值已被使用。 我的更新方法是这样的:

public function update(Request $request, $id)
{
    $rules = array(
        'name' => 'unique:my_table'
    );

    $validator = Validator::make($request->all(), $rules);

    if ($validator->passes()) {
        MyModel::find($id)->update($request->input());
        return redirect()->route('myroute')->withFlashSuccess('Ok!');
    } else {
        return redirect()->back()->withInput()->withErrors($validator);
    }
}

我做错了什么?

此人写了一篇博客文章,看起来可以解决您的问题:

https://wisdmlabs.com/blog/laravel-soft-delete-unique-validations/

我不确定100%是否要执行此操作,因为您稍后可能希望使用restore()方法将软删除的数据恢复。 此时,您将发生碰撞。

该问题与SoftDeletes ,这是一个验证问题。 unique验证规则非常特殊,因为在进行更新的情况下,它需要知道执行验证时可能忽略的条目。 在后台,规则正在执行SQL查询,例如

IF EXISTS (
    SELECT id
    FROM   my_table
    WHERE  name = 'some value'
) 
    SELECT  1
ELSE 
    SELECT  0

(它可能不是确切的查询,但类似)。

如您所见,无论是否执行更新,查询都不会考虑。 因为您的实体已经存在,所以它将返回1 ,因此验证失败,因为它认为验证中的值不是唯一的。

但是实际上,有一种方法可以使验证适用于更新。 您只需要将现有实体的id (正在验证)添加为验证规则的第三个参数。 因此,您的规则应如下所示:

$rules = [
    'name' => 'unique:my_table,name,'.$id
];

请注意, unique验证规则还有另一个参数-您要搜索的数据库表的列。


编辑:

如果唯一约束确实只与未删除的条目有关,这意味着如果将相同值的其他出现标记为已删除,则可以重用唯一值,那么可能有必要在unique验证中添加一个额外的where()子句规则。 为此,需要将第四个参数设置为identifier列名称,然后我们可以将附加的where子句添加为两个参数对。

$rules = [
    'name' => 'unique:my_table,name,'.$id.',id,deleted_at,NULL'
];

这会将where('deleted_at', 'NULL') (或whereNull('deleted_at') )添加到查询中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM