Прикрепить ко всем возможным отношениям метод «многие ко многим» при создании? - PullRequest
3 голосов
/ 10 апреля 2019

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

  • Event:
<?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.

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

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

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

Ответы [ 2 ]

8 голосов
/ 19 апреля 2019

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

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

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

1 голос
/ 19 апреля 2019

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

// 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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...