2014-10-17 82 views
1

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

现在,当我再次尝试添加名为“Test”的类别时,它正在说我已经拍摄了该名称。我已经尝试过发布Here的规则。

但它不工作。我在模型中使用了特质。以下是我的模型代码。

<?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

据我的了解laravel使用deleted_at列软删除,但数据库(MySQL的)不知道,所有它知道这是datetime列,所以,当你犯了一个列独特数据库遵循规则,保持其独特... ,我认为这将帮助你http://stackoverflow.com/questions/17458681/laravel-4-how-use-use-a-unique-validation-rule-unique -columns-with-soft-delet?​​lq = 1 – NULL 2014-10-17 11:47:12

回答

3

第一:我不明白几件事情。你是否想要验证创建和更新?那么为什么你允许名称的长度为2到100,而更新后只有3到64?

二:我建议这个下降:

protected $dates = ['deleted_at']; 

我看不到的,我们的目标。

第三,我在这里谈到了,你想做什么?我想,你想用这个过滤器'unique:travel_categories,name,NULL,id,deleted_at,NULL'要做的是检查活动类别中name的唯一性。在那种情况下,这应该起作用。

+0

我在这里使用了验证规则。我想要的是当我创建或更新新记录时,它将应用用户输入的值的验证规则。规则在'validate'方法中被提及。现在,当我尝试创建或更新新类别时,它应该检查数据库中具有'deleted_at = null'的'category name'的唯一性。 – 2014-10-20 06:00:01

3

您是否了解软删除目的?它只会将数据标记为不活动。它会在那里。

因此,如果您定义该列的值必须是唯一的,那么您无法创建其他类似的对象。

  • 如果它需要是唯一的,那么你应该是restoreupdate的数据。
  • 如果它可以有很多个,那么你应该删除应用于其上的唯一密钥(并且通过例如关系来调用它)。

看:Laravel Eloquent Soft Deleting