Имеет много через обновление / с pivot laravel 5.5 - PullRequest
0 голосов
/ 10 мая 2018

У меня есть несколько таблиц (все они с созданными, обновленными, удаленными):

  • сектора
  • lang_sector
  • valuechains
  • lang_valuechain
  • 1012 * сегменты *
  • lang_segment
  • keyneeds
  • keyneed_lang

таблицы связаны в следующем порядке: сектора имеет много цепочек цепочки создания стоимости имеют много сегментов сегментов имеет много ключевых потребностей

Вот моя модель:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Sector extends Model
{
    use SoftDeletes;

    protected $table = "sectors";
    protected $fillable = ['admin_id'];
    protected $dates = [ 'created_at', 'updated_at', 'deleted_at' ];

    public function langs() {
        return $this->belongsToMany('App\Lang')
            ->withPivot('sectname', 'sectshortname', 'segname_slug',
                'sectdescription', 'sectshortdescription'
            )
            ->withTimestamps();
    }
    public function admin()
    {
        return $this->belongsTo('App\Admin');
    }

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

    $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() ] );
    $sector->segments()->update( [ 'segments.deleted_at' => Carbon::now() ] );
    $sector->keyneeds()->update( [ 'keyneeds.deleted_at' => Carbon::now() ] );
    Sector::where('id', $id)->delete();

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

Моя проблема заключается в том, что он не обновляет следующие таблицы: сегменты и ключевые потребности (в которых есть поля create_at, updated_at и dele_at) и их сводные таблицы ... И у меня есть сообщение об ошибке:

SQLSTATE [23000]: нарушение ограничения целостности: 1052 Поле: «updated_at» в списке полей неоднозначно (SQL: обновление segments внутреннее объединение valuechains в valuechains. id = segments. valuechain_id set segments. deleted_at = 2018-05-10 06:54:54, updated_at = 2018-05-10 06:54:54 где valuechains. sector_id = 2)

добавляет: updated_at

Я успешно обновил:

  • таблица секторов
  • таблица значений
  • lang_valuechain pivot

Моя проблема заключается в обновлении

  • сегментирует таблицу, используя: $ sector-> сегменты ()
  • таблица ключевых значений с помощью: $ sector-> keyneeds ()

И их сводная таблица ... Я читаю документацию, но это не помогает. Я использую метод update (), потому что $ sector-> сегменты () -> удаление () пытается выполнить полное удаление ...

1 Ответ

0 голосов
/ 13 мая 2018

Я наконец-то нашел проблему в этом .. Не очень элегантно, но работает на "главных" столах. Мне нужно решить небольшую проблему с сводными таблицами:

public function destroy($id)
{
    $sector = Sector::findOrFail($id);
    $valuechains = Valuechain::where('sector_id','=',$sector->id)->get();
    foreach ($valuechains as $valuechain) {
        $segments = Segment::where('valuechain_id', '=', $valuechain->id )->get();
        $valuechain->langs()->updateExistingPivot($valuechain->id, ['lang_valuechain.deleted_at' => Carbon::now()]);

        foreach ($segments as $segment) {
            $keyneeds = Keyneed::where('segment_id', '=', $segment->id)->get();
            $segment->langs()->updateExistingPivot($segment->id, ['lang_segment.deleted_at' => Carbon::now()]);
            $segment->delete();

            foreach ($keyneeds as $keyneed) {
                $keyneed->langs()->updateExistingPivot($keyneed->id, ['keyneed_lang.deleted_at' => Carbon::now()]);
                $keyneed->delete();
            }
        }
        $valuechain->delete();
    }
    $sector->langs()->updateExistingPivot($id, ['lang_sector.deleted_at' => Carbon::now()]);
    $sector->delete();

    return redirect()->route('sectors.index')->with('success', 'Secteur suppprimé');
}
...