Reputation: 1489
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
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