davidvera
davidvera

Reputation: 1489

Update multiple tables with laravel

I have to update multiple tables in one request ... For this I create a method where i wrote :

$sector = Sector::where('sectors.id', '=', $id)
    ->join('valuechains', 'sectors.id', '=', 'valuechains.sector_id')
    ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
    ->join('segments', 'valuechains.id','=', 'segments.valuechain_id')
    ->join('lang_segment', 'segments.id', '=', 'lang_segment.segment_id')
    ->join('keyneeds', 'segments.id', '=', 'keyneeds.segment_id')
    ->join('keyneed_lang', 'keyneeds.id', '=', 'keyneed_lang.keyneed_id');
 $sector->update(
    ['sectors.deleted_at' =>  Carbon::now()],
    ['lang_sector.deleted_at'  => Carbon::now()],
    ['valuechains.deleted_at' => Carbon::now()],
    ['lang_valuechain.deleted_at' => Carbon::now()],
    ['segments.deleted_at' => Carbon::now()],
    ['lang_segment.deleted_at' => Carbon::now()],
    ['keyneeds.deleted_at' => Carbon::now()],
    ['keyneed_lang.deleted_at' => Carbon::now()]
);

Unfortunatelly i have an error message concerning 'updated_at' :

SQLSTATE[23000]: Integrity constraint violation: 1052 Champ: 'updated_at' dans field list est ambigu (SQL: update sectors inner join valuechains on sectors.id = valuechains.sector_id inner join lang_valuechain on valuechains.id = lang_valuechain.valuechain_id inner join segments on valuechains.id = segments.valuechain_id inner join lang_segment on segments.id = lang_segment.segment_id inner join keyneeds on segments.id = keyneeds.segment_id inner join keyneed_lang on keyneeds.id = keyneed_lang.keyneed_id set sectors.deleted_at = 2018-05-10 17:54:51, updated_at = 2018-05-10 17:54:51 where sectors.id = 2 and sectors.deleted_at is null)

Upvotes: 0

Views: 2697

Answers (1)

Alex Harris
Alex Harris

Reputation: 6402

It looks as if you are trying to do cascading soft deletes. You might want to investigate using a package to help make this easier, you can check out a package to achieve this here. Here is some sample code from the documentation:

<?php

namespace App;

use App\Comment;
use Iatstuti\Database\Support\CascadeSoftDeletes;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes, CascadeSoftDeletes;

    protected $cascadeDeletes = ['comments'];

    protected $dates = ['deleted_at'];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

Alternatively I would recommend doing this was a raw query as I don't think QueryBuilder is suited for this type of situation.

Upvotes: 0

Related Questions