У меня есть две модели с именем «Позиция» и «Событие», они имеют отношения «многие ко многим» друг с другом.
<?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() для создания соединений, явно называя идентификаторы всех позиций в базе данных. В методе EventController
store
:
$data = $request->all();
$event = Event::create($data);
$event->positions()->sync([1, 22, 34, 167]);
Но чтобы это сработало, мне сначала нужно получить все записи из таблицы positions
, отформатировать их в массив идентификаторов и передать этому методу. Есть ли встроенный или канонический способ сделать это?
Встроенного способа нет, но ручное решение довольно короткое:
$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]);