【发布时间】: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