假设我有类别表,我在其上使用了软删除。现在我第一次添加了一个类别"测试"之后我删除了这个类别,因此它将从数据库中更新我的deleted_at
列。
现在我又一次尝试添加名称类别"测试"它告诉我这个名字已被采用。我尝试过发布Here的规则。
但它不起作用。我在我的模型中使用过trait。下面是我的型号代码。
<?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();
}
}
答案 0 :(得分:3)
您是否了解软删除目的?它只会将数据标记为非活动状态。它会在那里。
因此,如果您定义该列的值必须是唯一的,那么您就无法创建其他类似的值。
restore
和update
数据。答案 1 :(得分:1)
第一:我不了解一些事情。您是否尝试验证创建和更新?那你为什么要允许名字的长度为2到100来创建,而更新后只有3到64?
第二:我建议放弃这个:
protected $dates = ['deleted_at'];
我没有看到那个目标。
第三,我已经到了这里,你想做什么?我想,您尝试使用此过滤器'unique:travel_categories,name,NULL,id,deleted_at,NULL'
尝试检查活动类别中name
的唯一性。在那种情况下,这应该有用。
答案 2 :(得分:0)
我知道这个问题很旧,但是我遇到了类似的问题,我偶然发现了这个问题。我想提一下我如何为将来阅读它的任何人修复它。我遇到的问题是,当有一条具有相同值的旧记录时,Laravel不允许我在唯一列中插入值,而是使用soft_delete将其删除。
总而言之,目标是在插入新记录时忽略唯一列的旧软删除记录。我找到的解决方案在表的迁移中。例如,假设我们有以下列:
在迁移过程中,两者均应指定为唯一:
Schema::create('table_name', function (Blueprint $table) {
$table->string("category");
$table->softDeletes();
$table->unique(["category", "deleted_at"]);
});
旁注:如果您已经拥有像我一样的表,则需要更改迁移并再次创建表(显然数据将丢失):