首页 > 解决方案 > 使用 laravel 和 Eloquent 对表和数据透视表进行级联更新

问题描述

我创建了一个名为扇区的模型。对于这个模型,我创建了在数据库表之间建立链接的方法:

它是这样翻译的:

public function valuechains()
{
    return $this->hasMany('App\Valuechain');
}
public function segments()
{
    return $this->hasManyThrough('App\Segment', 'App\Valuechain');
}
public function keyneeds()
{
    return $this->hasManyThrough('App\Keyneed', 'App\Segment', 'App\Valuechain');
}

当我软删除一个扇区时,我想在其他表上创建级联并进行更新。

我的销毁方法是:

public function destroy($id)
{
    $sector = Sector::findOrFail($id);
    // on update lang_sector pour chaque id
    $sector_ids = $sector->langs()->allRelatedIds();
    foreach ($sector_ids as $id){
        $sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
    }
    $sector->valuechains()->update(
        [
            'valuechains.deleted_at' => Carbon::now(),
            'valuechains.updated_at' => Carbon::now(),
        ]
    );
    $sector->segments()->update(
        [
            'segments.deleted_at' => Carbon::now(),
            'segments.updated_at' => Carbon::now(),
        ]
    );
    $sector->keyneeds()->update(
        [
            'keyneeds.deleted_at' => Carbon::now(),
            'keyneeds.updated_at' => Carbon::now()
        ]
    );

    Sector::where('id', $id)->delete();

    return redirect()->route('sectors.index')->with('success', 'Sector deleted');
}

我有价值链、细分和关键需求的数据透视表,我还想更新这些表上的 updated_at 和 deleted_at 列......

对于这 3 个表,我在模型中添加了用于定义数据透视关系和定义数据透视表中的字段的 lang 方法:

public function langs() {
    return $this->belongsToMany('App\Lang')
        ->withPivot(
            'vcname',
            'vcshortname',
            'vcdescription',
            'vcshortdescription',
            'created_at',
            'updated_at',
            'deleted_at'
        );
}

我有一条错误消息:

SQLSTATE [23000]:完整性约束违规:1052 冠军:'updated_at' dans field list est ambigu(SQL:更新segments内部联接valuechainsvaluechains. id= segments. valuechain_idset valuechains. deleted_at=2018-05-09 07:34:30,valuechains. updated_at=2018-05- 09 07:34:30, segments. deleted_at= 2018-05-09 07:34:30, segments. updated_at= 2018-05-09 07:34:30, **updated_at**= 2018-05-09 07:34:30 其中valuechains. sector_id= 2)

标签: eloquentlaravel-5.5

解决方案


推荐阅读