Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel软删除唯一列名_Php_Laravel_Unique_Soft Delete - Fatal编程技术网

Php Laravel软删除唯一列名

Php Laravel软删除唯一列名,php,laravel,unique,soft-delete,Php,Laravel,Unique,Soft Delete,假设我有一个分类表,并且我对它使用了软删除。现在我第一次添加了一个类别“Test”,之后我删除了这个类别,这样它将更新数据库中的deleted\u列 现在,当我再次尝试添加名为“Test”的类别时,它告诉我该名称已被采用。我已经尝试过发布的规则 但它不起作用。我在我的模型中使用了trait。下面是我的模型代码 <?php namespace App\Models; use Illuminate\Support\Facades\Validator as Validator; use Ill

假设我有一个分类表,并且我对它使用了软删除。现在我第一次添加了一个类别“Test”,之后我删除了这个类别,这样它将更新数据库中的
deleted\u列

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

但它不起作用。我在我的模型中使用了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();
    }
}

首先:有几件事我不懂。您是否正在尝试验证创建和更新?那么,为什么您允许名称在创建时的长度为2到100,在更新之后的长度仅为3到64

第二:我建议放弃这个:

protected $dates = ['deleted_at'];
我看不出这有什么目的


第三,我要说的是,你想做什么?我想,您尝试使用此筛选器
的唯一性:旅行类别,名称,NULL,id,deleted,at,NULL'
是为了检查活动类别中
名称的唯一性。在这种情况下,应该可以了。

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

因此,如果定义该列的值必须是唯一的,则不能创建其他相同的值

  • 如果需要唯一,则应
    恢复
    更新
    数据
  • 如果它可以有多个,那么您应该删除应用于它的唯一键(例如,通过关系调用它)

请看:

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

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

  • 类别-唯一
  • deleted_at-保留已删除行的跟踪
在迁移过程中,两者都应指定为唯一的,如下所示:

 Schema::create('table_name', function (Blueprint $table) {
        $table->string("category");
        $table->softDeletes();
        $table->unique(["category", "deleted_at"]);
    });
旁注:如果您已经像我一样拥有了表,则需要更改迁移并再次创建表(显然数据将丢失):

  • 移开桌子
  • 改变迁移
  • 从迁移表中删除关于它的记录
  • 运行“php artisan migrate”再次创建表

根据我的理解,laravel使用deleted_at column进行软删除,但数据库(mysql)并不知道这一点,它完全理解它的datetime列,因此,当您使一个列唯一时,数据库遵循规则,保持其唯一性。。。我想这会对你有所帮助,我在这里使用了验证规则。我想要的是,当我创建或更新新记录时,它将应用验证规则来对抗用户输入的值。规则在
validate
方法中提到。现在,当我尝试创建或更新新类别时,它应该检查
类别名称
的唯一性,该名称在数据库中已
删除\u at=null
。很抱歉,这不起作用。未删除的行在“deleted_at”列中将具有null,并且null值不会触发“unique”约束。这种独特的约束只能保证不会同时删除两个类别。也许这是一种误解。我确实希望
“deleted_at”=null
的行不会“触发唯一约束”。如果
“deleted_at”=null
,则我们有一个活动行,这意味着它已插入,但尚未被软删除。因此,它将被忽略,唯一性检查将只使用“category”列中的值,这是上面示例中的主要唯一列。这个设置为我做的是,它允许唯一检查像往常一样工作,但忽略软删除行。只是为了确认解决方案工作正常。太好了!非常感谢。