Laravel Как сделать валидацию наличие связанных записей в manyto many связи?

Для осуществления валидации наличия связанных записей в отношении «многие ко многим» (many-to-many) в Laravel, вы можете использовать правило валидации called. Для этого вам потребуется создать свой собственный валидатор.

Вот шаги, которые вам нужно выполнить:

1. Создайте новый класс валидатора, которому в конструктор будет передаваться имя связи many-to-many и модель, которая выступает в качестве промежуточной модели. Это позволит вам получить доступ к этим данным в процессе валидации. Класс валидатора может выглядеть следующим образом:

namespace AppValidators;

use IlluminateContractsValidationRule;

class ManyToManyExists implements Rule
{
    protected $relationship;
    protected $model;

    public function __construct($relationship, $model)
    {
        $this->relationship = $relationship;
        $this->model = $model;
    }

    public function passes($attribute, $value)
    {
        $count = $this->model->{$this->relationship}()->whereIn('id', $value)->count();
        return $count === count($value);
    }

    public function message()
    {
        return 'One or more of the related records do not exist.';
    }
}

2. Затем вы можете применить этот валидатор в правилах валидации в вашем контроллере или любом другом месте, где вы выполняете валидацию данных. Пример правила валидации может выглядеть следующим образом:

use AppValidatorsManyToManyExists;
// ...

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'related_ids' => [
            'required',
            new ManyToManyExists('related', new YourModel)
        ],
    ]);

    // ...
}

В этом примере мы используем правило валидации new ManyToManyExists('related', new YourModel), где 'related' - это название отношения many-to-many в модели 'YourModel'. Это позволит валидатору проверить наличие связанных записей в соответствующей связи.

Таким образом, если одна или несколько из связанных записей отсутствует, валидатор вернет false и возвращаемое сообщение будет 'One or more of the related records do not exist.'.

Это только один из возможных способов реализации валидации наличия связанных записей в отношении «многие ко многим» в Laravel. Вы можете приспособить этот пример под свои потребности и подходить к реализации этой функциональности наиболее эффективным и удобным для вас способом.