Освоение проверки Laravel с помощью мягкого удаления: игнорирование удаленных записей

В 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 и настраиваемые правила проверки с использованием построителя запросов — все они предоставляют гибкие решения для обработки обратимого удаления. Не забудьте адаптировать эти методы в соответствии с требованиями вашего конкретного приложения.