我有一个模型SalesArea
,其中有很多Regions
。 Regions
属于一个SalesArea
。
class SalesArea extends Model
{
public function regions() {
return $this->hasMany('App\Region');
}
}
class Region extends Model
{
public function sales_area() {
return $this->belongsTo('App\SalesArea');
}
}
由于组织上的某些更改,在创建区域之后,将创建父级(SalesArea)。创建销售区域记录时,我正在尝试将区域与其关联的销售区域相关联。
我创建了一个迁移,以将sales_area_id添加到regions
表中,并且它们目前都为空。
我有一个具有不同区域ID的选择框,我想立即使用ID数组将区域与销售区域相关联。没有任何一种关联方法有效。
$area = SalesArea::create($request->all());
$area->regions()->attach([1,2,3]); // BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::attach()
$area->regions()->add([1,2,3]); // BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::add()'
$area->regions()->sync([1,2,3]); // BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::sync()'
$area->regions()->associate([1,2,3]); // BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::associate()'
我对应该如何工作感到困惑。地区已经存在,我只需要将它们的关系添加到关联的销售区域。
答案 0 :(得分:1)
请确保您的sales_area_id
表中有regions
列
$salesArea = SalesArea::create($request->all());
$regions = Region::whereIn('id', [1, 2, 3])->get();
$salesArea->regions()->saveMany($regions);
我不确定,为什么要用这种方式创建区域。如果SalesArea与Region之间存在hasMany()
关系,则应按如下所示创建所有区域:
$salesArea->regions()->create([ ... ]);
如果你的关系是这样的
class SalesArea extends Model
{
public function regions() {
return $this->belongsToMany(Region::class)->withPivot(['id'])->withTimestamps();
}
}
class Region extends Model
{
public function sales_area() {
return $this->belongsToMany(SalesArea::class)->withPivot(['id'])->withTimestamps(
}
}
然后您可以执行类似的操作。
$salesArea = SalesArea::create($request->all());
$regions = Region::whereIn('id', [1, 2, 3])->get();
$salesArea->regions()->sync($regions->pluck('id')->toArray());
答案 1 :(得分:0)
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|unique:sales_areas',
'regions' => 'required|array',
'regions.*' => 'int',
]);
$salesArea = SalesArea::create($request->all());
// Because we have a hasMany not a many to many, we have to do it this way
Region::whereIn('id', $request->regions)->update(['sales_area_id' => $salesArea->id]);
flash('Created Sales Area ' . $salesArea->name);
return redirect()->route('areas.index', $salesArea->id);
}