В Laravel процесс проверки играет решающую роль в обеспечении целостности и согласованности данных вашего приложения. Однако при работе с обратимым удалением, когда записи не удаляются физически из базы данных, а помечаются как удаленные, вы можете столкнуться со сценариями, в которых вам придется игнорировать эти обратимо удаленные записи во время проверки. В этой статье мы рассмотрим различные методы достижения этой цели в Laravel, используя разговорный язык и практические примеры кода.
Метод 1: использование правила «withoutTrashed»
Один простой способ игнорировать обратимо удаленные записи во время проверки — использовать правило «withoutTrashed». Это правило отфильтровывает любые удаленные записи в процессе проверки. Вот пример того, как его можно использовать:
use Illuminate\Validation\Rule;
$rules = [
'email' => [
'required',
'email',
Rule::unique('users')->withoutTrashed(),
],
];
Метод 2: настраиваемое правило проверки
Другой подход заключается в создании настраиваемого правила проверки, исключающего обратимо удаленные записи. Вот пример того, как это можно реализовать:
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Database\Eloquent\SoftDeletes;
class UniqueWithoutDeleted implements Rule
{
use SoftDeletes;
protected $table;
protected $column;
public function __construct($table, $column)
{
$this->table = $table;
$this->column = $column;
}
public function passes($attribute, $value)
{
return empty($this->getDeletedRecords($value));
}
public function message()
{
return 'The :attribute has already been taken.';
}
protected function getDeletedRecords($value)
{
return $this->newQueryWithoutScopes()
->where($this->column, $value)
->onlyTrashed()
->get();
}
}
// Usage example:
$rules = [
'email' => [
'required',
'email',
new UniqueWithoutDeleted('users', 'email'),
],
];
Метод 3: пользовательское правило проверки с использованием построителя запросов
Если вы предпочитаете использовать построитель запросов вместо моделей Eloquent, вы можете добиться того же результата, создав собственное правило проверки, которое применяет необходимые ограничения запроса. Вот пример:
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\DB;
class UniqueWithoutDeleted implements Rule
{
protected $table;
protected $column;
public function __construct($table, $column)
{
$this->table = $table;
$this->column = $column;
}
public function passes($attribute, $value)
{
return empty($this->getDeletedRecords($value));
}
public function message()
{
return 'The :attribute has already been taken.';
}
protected function getDeletedRecords($value)
{
return DB::table($this->table)
->where($this->column, $value)
->whereNotNull('deleted_at')
->get();
}
}
// Usage example:
$rules = [
'email' => [
'required',
'email',
new UniqueWithoutDeleted('users', 'email'),
],
];
Используя эти методы, вы можете эффективно игнорировать обратимо удаленные записи во время процесса проверки в Laravel. Правило «withoutTrashed», настраиваемые правила проверки с моделями Eloquent и настраиваемые правила проверки с использованием построителя запросов — все они предоставляют гибкие решения для обработки обратимого удаления. Не забудьте адаптировать эти методы в соответствии с требованиями вашего конкретного приложения.