Прикрепить ко всем возможным отношениям из метода «многие ко многим» при создании?

У меня есть две модели с именем «Позиция» и «Событие», они имеют отношения «многие ко многим» друг с другом.

  • Мероприятие:
<?php

class Event extends Model
{
    protected $fillable = [
        'name', 'opta_id'
    ];

    public function positions() {
        return $this->belongsToMany(Position::class);
    }
}
  • Позиция:
class Position extends Model
{
    protected $fillable = [
        'name', 'short_name'
    ];

    public function events() {
        return $this->belongsToMany(Event::class);
    }
}

Каждый event должен иметь сводную запись для каждого position, находящегося в настоящее время в базе данных, исключений нет. Поэтому каждый раз, когда пользователь создает новый event, я хочу создать сводную запись для каждого существующего position.

Я изо всех сил пытаюсь понять это, используя документацию и SO. Я мог бы использовать sync() или attach() для создания соединений, явно называя идентификаторы всех позиций в базе данных. В методе EventControllerstore:

$data = $request->all();
$event = Event::create($data);
$event->positions()->sync([1, 22, 34, 167]);

Но чтобы это сработало, мне сначала нужно получить все записи из таблицы positions, отформатировать их в массив идентификаторов и передать этому методу. Есть ли встроенный или канонический способ сделать это?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
162
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Встроенного способа нет, но ручное решение довольно короткое:

$event->positions()->attach(Position::pluck('id'));

attach() более эффективен, чем sync(), потому что он вставляет все сводные записи в один запрос.

У меня есть другое решение, поэтому, чтобы достичь своей цели, у вас есть

// the 1st sync will remove all the relationship to the position table
$event->positions()->sync([1, 22, 34, 167]);
// the 2nd sync is to extend the relationship from the 1st
$event->positions()->syncWithoutDetaching([1, 22, 34, 167]);

Другие вопросы по теме