3

假设我有类别表,并且我在上面使用了软删除。现在我第一次添加了一个类别“测试”,之后我删除了这个类别,所以它会deleted_at从数据库中更新我的列。

现在,当我再次尝试添加名称为“Test”的类别时,它告诉我这个名称已被使用。我已经尝试过发布在这里的规则。

但它不起作用。我在我的模型中使用了特征。下面是我的模型代码。

<?php
namespace App\Models;

use Illuminate\Support\Facades\Validator as Validator;
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Category extends \Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

    /**
     * Guarded fields which are not mass fillable
     *
     * @var array
     */
    protected $guarded = array('id');

    /**
     * Name of the table used
     *
     * @var string
     */
    protected $table = 'travel_categories';

    /**
     * Validating input.
     *
     * @param array $input
     * @return mixed (boolean | array)
     */
    public static function validate($input, $id = null) {
        $rules = array(
            'name' => array('required','min:2','max:100','regex:/[a-zA-z ]/','unique:travel_categories,name,NULL,id,deleted_at,NULL'),
            'description' => 'Required|Min:2',
            'image' => 'image'
        );
        if ($id) {
            $rules['name'] = 'Required|Between:3,64|Unique:travel_categories,name,'.$id;
        }

        $validation = Validator::make($input,$rules);

        return ($validation->passes())?true : $validation->messages();
    }
}
4

3 回答 3

3

您了解软删除的目的吗?它只会将数据标记为非活动状态。不过它会在那里。

因此,如果您定义该列的值必须是唯一的,那么您不能创建其他类似的值是正确的。

  • 如果它需要是唯一的,那么你应该restoreupdate数据。
  • 如果它可以有很多,那么您应该删除应用于它的唯一键(例如通过关系调用它)。

看:Laravel Eloquent 软删除

于 2014-10-17T13:55:58.097 回答
1

首先:我不明白几件事。您是否尝试验证创建和更新?那么为什么你允许 name 的长度为 2 到 100 用于创建,而只有 3 到 64 用于更新后?

第二:我建议放弃这个:

protected $dates = ['deleted_at'];

我看不到这样做的目的。

第三,我要说到点子上了,你想做什么?我想,你试图用这个过滤器做的是检查活动类别之间的'unique:travel_categories,name,NULL,id,deleted_at,NULL'唯一性。name在这种情况下,这应该有效。

于 2014-10-17T13:19:25.290 回答
-1

我知道这个问题很老,但我有一个类似的问题,我偶然发现了这个。我想提一下我是如何为将来阅读它的任何人修复它的。我遇到的问题是,当存在具有相同值的旧记录但使用 soft_delete 删除时,Laravel 不允许我在唯一列中插入值。

总而言之,目标是在插入新记录时忽略唯一列的旧软删除记录。我找到的解决方案是在表的迁移中。例如,假设我们有这些列:

  • 类别 - 独特的
  • deleted_at - 跟踪已删除的行

两者都应在迁移中指定为唯一,如下所示:

 Schema::create('table_name', function (Blueprint $table) {
        $table->string("category");
        $table->softDeletes();
        $table->unique(["category", "deleted_at"]);
    });

旁注:如果您已经像我一样拥有表,则需要更改迁移并再次创建表(显然数据会丢失):

  • 删除表
  • 更改迁移
  • 从迁移表中删除关于它的记录
  • 运行“php artisan migrate”再次创建表
于 2020-03-20T13:28:20.430 回答