【问题标题】:laravel custom validation rule when updating recordlaravel 更新记录时的自定义验证规则
【发布时间】:2019-06-24 04:55:56
【问题描述】:

我在课程模型中有 2 个系列和课程表。我有关系将课程与系列相关联,我创建了一个自定义验证规则,以防止课程表中的相同 episode_number 在同一个系列中重复,它工作正常,但在更新时我想排除这节课的检查。

这是我的课程表:

public function up()
{
    Schema::create('lessons', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('series_id');
        $table->string('title');
        $table->text('description');
        $table->unsignedInteger('episode_number');
        $table->unsignedInteger('video_id')->unique();
        $table->boolean('premium')->default(0);
        $table->timestamps();

        $table->unique(['series_id', 'episode_number']);
    });
}

这是课程模型中的 Eloquent 关系函数:

public function series()
{
    return $this->belongsTo(Series::class);
}

这是我的自定义验证规则:

<?php
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\DB;

class uniqueSeriesLessonValidation implements Rule
{
public $id;
/**
 * Create a new rule instance.
 *
 * @return void
 */
public function __construct($id)
{
    $this->id = $id;
}

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{
    $count = DB::table('lessons')->where('episode_number', $value)
        ->where('series_id', $this->id)
        ->count();

    if ($count === 0){
        return true;
    }

    return false;

}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return 'The lesson title should not be repeated in the same series twice.';
}
}

这是我在创建新课程时的验证,它可以很好地防止同一系列中的同一课的 episode_number 重复两次:

public function rules(Request $request)
{
    return [
        'title' => 'required',
        'description' => 'required',
        'episode_number' => ['required',new uniqueSeriesLessonValidation($request->series_by_id->id)],
        'video_id' => 'required|unique:lessons|numeric'
    ];
}

这是我更新课程时的验证,问题出在:

public function rules(Request $request)
{
    return [
        'title' => 'required',
        'description' => 'required',
        'episode_number' => ['required',new uniqueSeriesLessonValidation($request->series_by_id->id),$request->lesson->id],
        'video_id' => 'required'
    ];
}

【问题讨论】:

  • 我建议使用复合唯一键。这样,完整性由数据库强制执行。但是,您也可以使用 Laravel mutator 来防止这种情况发生。
  • 如上所示,我的表迁移文件中已经设置了一个复合唯一键,但是如何使用 mutator 来防止这种情况呢?

标签: php laravel validation laravel-5 eloquent


【解决方案1】:

这是因为它认为$request-&gt;lesson-&gt;id 是一个单独的角色。如果您还想将该值传递给角色,请将其作为参数进行。

new uniqueSeriesLessonValidation($request->series_by_id->id,$request->lesson->id)

【讨论】:

    【解决方案2】:

    谢谢大家,我通过在更新时添加第二个参数并在创建时通过在接收该参数时更改规则来创建 null 解决了这个问题

    【讨论】:

    • passes 方法的第二个参数如何处理?
    猜你喜欢
    • 2017-04-11
    • 2018-02-18
    • 2019-02-12
    • 2016-11-22
    • 2018-05-25
    • 2016-11-14
    • 1970-01-01
    • 2021-08-30
    • 2015-01-26
    相关资源
    最近更新 更多