将现有记录附加到eloquent hasMany / belongsTo关系

问题描述 投票:2回答:2

我有一个模型SalesArea,有很多RegionsRegions属于一个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记录时尝试将Regions与其关联的Sales区域相关联。

我创建了一个迁移,将sales_area_id添加到regions表中,它们目前都是null。

我有一个具有各种区域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()'

我对这应该如何工作感到难过。区域已经存在,我只需要将它们的关系添加到它们的相关销售区域。

laravel laravel-5 eloquent
2个回答
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()relation,则应创建所有区域,如:

$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());

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.