在创建时是否要从多对多方法附加所有可能的关系?

时间:2019-04-10 11:02:26

标签: laravel events eloquent database-relations

我有两个名为Position和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创建一个透视条目。

我正在努力使用文档和SO来解决这个问题。我可以通过显式命名db中所有位置的ID来使用sync()或attach()进行连接。在EventController的{​​{1}}方法中:

store

但是,要使其正常工作,我首先必须从$data = $request->all(); $event = Event::create($data); $event->positions()->sync([1, 22, 34, 167]); 表中获取所有条目,将它们格式化为ID数组,然后将它们传递给此方法。有任何内置或规范的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:8)

没有内置方法,但是手动解决方案很短:

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

attach()sync()更有效率,因为它可以在单个查询中插入所有数据透视记录。

答案 1 :(得分:1)

我已经获得了另一种解决方案,所以为了实现您的目的,您已经

// 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]);