【问题标题】:how to ignore soft delete in laravel multiple unique columns in laravel 5.3如何在laravel 5.3中忽略laravel中的多个唯一列中的软删除
【发布时间】:2016-12-23 11:18:51
【问题描述】:

我现在一直在做一个项目。在这我被困住了。我只想在我的验证中忽略 laravel 的软删除,该验证具有唯一的名称列 parent_id。

例如: 假设 A & B 是类别。我希望如果 C 是 A 的子类别,那么没有其他 C 数据不写在 A 中。但是 C 可以写在 B 类别中。

我也希望如果用户 SoftDeletes 数据,那么他可以插入具有相同名称和相同类别的相同数据。

我的桌子是

Schema::create('categories', function (Blueprint $table) {
  $table->increments('id');
  $table->string('name');
  $table->integer('parent_id')->nullable()->default(0);
  $table->integer('admin_id')->nullable()->default(0);
  $table->boolean('active')->nullable()->default(1);
  $table->unique(array('parent_id', 'name', 'deleted_at'));
  $table->rememberToken();
  $table->timestamps();
  $table->softDeletes();
});

我的 Store 方法是

public function store(Request $request)
{
  $this->validate($request, [
    'category' => 'required|unique:categories,parent_id,NULL,name,NULL,id,deleted_at,NULL',
    'parent' => 'required',
    '_token'   => '',
  ]);

  try {
    $category = New Category();
    $category->name = $request['category'];
    $category->parent_id = $request['parent'];
    $category->remember_token = $request['_token'];
    $category->save();
    $request->session()->flash('alert-success', 'Sub Category Successfully Created!');
    return redirect('subcategory');    
  } catch(\Illuminate\Database\QueryException $e) {
    return redirect()->back()
                     ->with('status','<strong>'.$category.' already exist!</strong>');
  }            
}

我的模特是

<?php
namespace App;
use Illuminate\Notifications\Notifiable;

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

class Category extends Model
{
  use Notifiable;
  use SoftDeletes;
  protected $fillable = [
    'category',
  ];
  protected $dates = ['deleted_at'];
}

错误是

【问题讨论】:

    标签: php mysql laravel unique laravel-5.3


    【解决方案1】:

    试试

    ‘category' => 'required|unique:categories,parent_id,NULL,id,deleted_at,NULL,name,’.$request['category'], 
    

    更多细节,将参数成对分开:

    1. [类别,parent_id]

      • 这意味着应该在表categories,列parent_id 中实施唯一规则。
      • 如果 parent_id 的位置与左侧的“类别”相同,则可以忽略。例如

        ‘name’ => ‘unique:products,name’ 可以简化为

        ‘名称’=>‘独特:产品’。

    2. [NULL, id]

      • 唯一规则应排除 id 为空的项目。
      • 看起来很废话,因为 id 不能为空。
      • 但这对很特别。在 Laravel 唯一验证(vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php:getUniqueIds())中,它定义了参数的第三个位置一个特殊的。只要你想在之后附加其他约束,你就需要这个。就像一种格式。
      • 再一次,这是一对特别的。在更新验证中,您可以传入 id 以忽略更新的项目本身。
    3. [deleted_at, NULL]

      • 唯一规则应该在deleted_at 为空的范围内实现。
      • 这是您考虑软删除的地方。
      • 您可以使用 NOT_NULL 来表示相反的意思。

    因此,实现唯一规则的最终范围是从以下查询中得到的结果:

        Select count(*) from categories
        where id is not null
        and deleted_at is null
        and name is ??$request['category']??
    

    如果 count(*) 为 0,则验证通过。否则,失败。

    在第三对之后,您可以根据需要设置任意数量的约束。如:

    => 4. [活跃,真实]

    => 5. [name, hello],你可以用'!hello'来表示名字不是'hello'的地方

    【讨论】:

    • 第二对是特别的,也是唯一的一对。之后您不能添加另一个 [value, key] 对。这就是NULL, name, id, NULL 不起作用的原因。
    • 为什么在 #2 对中而不是 key,value 是 value,key。我的意思是,在某些情况下,我们使用“name”、“SomeName”,但为什么第二对中的“id”、NULL 不一样?
    • @JacoboTapia 它来自源代码——getUniqueIds() 函数:$idColumn = $parameters[3] ?? 'id'; 我不知道为什么它不是 [id, Null],我同意它是相当连贯的。您可以在此处放置其他列。例如,["female", "gender"] 将排除所有性别为“female”的记录。
    【解决方案2】:

    会不会是你的验证字符串不对? 不应该吗

    必填|唯一:类别、parent_id、NULL、名称、NULL、deleted_at、NULL

    【讨论】:

    • 试过但没有给出我预期的结果。它向我显示了上面描述的错误@veelen
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2017-01-30
    • 2017-06-02
    相关资源
    最近更新 更多