在创建时从多对多方法附加到所有可能的关系?
Attach to all possible relations from many-to-many method on create?
我有两个名为 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 来解决这个问题。我可以使用 sync() 或 attach() 通过显式命名数据库中所有位置的 ID 来建立连接。在 EventController
的 store
方法中:
$data = $request->all();
$event = Event::create($data);
$event->positions()->sync([1, 22, 34, 167]);
但要使其正常工作,我首先必须从 positions
table 中获取所有条目,将它们格式化为 ID 数组,然后将它们传递给此方法。是否有任何内置或规范的方法来执行此操作?
没有内置的方法,但是手动解决方案很短:
$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]);
我有两个名为 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 来解决这个问题。我可以使用 sync() 或 attach() 通过显式命名数据库中所有位置的 ID 来建立连接。在 EventController
的 store
方法中:
$data = $request->all();
$event = Event::create($data);
$event->positions()->sync([1, 22, 34, 167]);
但要使其正常工作,我首先必须从 positions
table 中获取所有条目,将它们格式化为 ID 数组,然后将它们传递给此方法。是否有任何内置或规范的方法来执行此操作?
没有内置的方法,但是手动解决方案很短:
$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]);