Обновление полей в сводной таблице Laravel 5.5 - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть 3 таблицы (2 + сводная):

categories
    id
    admin_id
    created_at
    updated_at
    deleted_at

langs
    id
    langname_fr
    langname
    ....

lang_sector
    lang_id
    sector_id
    sectname
    sectshortname
    ....

Я создал форму, которая позволяет создавать несколько записей в зависимости от количества языков, которые я определил ...

{!! Form::open( array('route' => 'maps.store','method' => 'POST') ) !!}
<fieldset>
    <legend>Nom du secteur</legend>

    @foreach($langs as $lang)

        <div class="form-group m-form__group">
            {{ Form::label( 'Nom du secteur en ' . $lang->langname_fr) }}
            {{ Form::text('sectname_lang_' . $lang->id, '' , [ 'class' => 'form-control m-input' ]) }}
        </div>
        <div class="form-group m-form__group">
            {{ Form::label( 'Nom abrégé du secteur en ' . $lang->langname_fr ) }}
            {{ Form::text('sectshortname_lang_' . $lang->id, '', [ 'class' => 'form-control m-input' ]) }}
        </div>
    @endforeach
</fieldset>
...

{!! Form::close() !!}

Если я хочу создать запись в моей базе данных, мне нужно создать несколько записей ...

public function sectorCreate(Request $request) {

    Sector::create(array(
        'admin_id' => Auth::guard('admin')->user()->id,
        'created_at' => Carbon::now(),
        'updated_at' => Carbon::now(),
     ));

    $sector = Sector::all()->last();
    $sector_id = Sector::all()->last()->id;
    $countLang = Lang::count();

    for ($i = 1; $i <= $countLang; $i++) {
        $insertSector[$i] = $sector->langs()->attach(
            $sector_id,
            [
                'lang_id' => $i,
                'sectname' => $request->input('sectname_lang_' .$i),
                'sectname_slug' => Str::slug($request->input('sectname_lang_' .$i)),
                'sectshortname' => $request->input('sectshortname_lang_' .$i),
                'sectdescription' => $request->input('sectdescription_lang_' .$i),
                'sectshortdescription' => $request->input('sectshortdescription_lang_' .$i),
                'created_at' => Carbon::now(),
                'updated_at' => Carbon::now(),
                'deleted_at' => NULL
            ]
        );
    }
    return redirect()->route('admin.home')->with('success', 'Secteur créé');
}

Теперь моя проблема - узнать, как я могу обновить значения базы данных и удалить запись ... Я пытался прочитать документацию, но я не уверен, что понял ее.

Например

lang_id     sector_id      sectname      sectshortname 
-------------------------------------------------------
1          1           longname1      shortname1
2          1           longname2      shortname2

После обновления я хотел бы обновить имя секты и имя секты ... Я провел несколько испытаний с использованием sync, syncWithoutDetaching и updateExistingPivot без успеха ...

Я также добавляю ограничения, рассматривая lang_id и sector_id в качестве первичного ключа ...

ОБНОВЛЕНИЕ ------------------------------------------- ---------------

Я изменил метод обновления, используя sync и syncWithoutDetaching

public function update(Request $request, $id)
{
    $sector = Sector::findOrFail($id);
    $countLang = Lang::count();

    $langs = Lang::all();
    foreach ($langs as $lang) {
        $lang_id = $lang->id;
    }

    for ($i = 1; $i <= $countLang; $i++) {
        $insertSector[$i] = $sector->langs()->sync(
            $sector->id,
            $lang_id,
            [
                'sectname' => $request->input('sectname_lang_' .$i),
                'sectname_slug' => Str::slug($request->input('sectname_lang_' .$i)),
                'sectshortname' => $request->input('sectshortname_lang_' .$i),
                'sectdescription' => $request->input('sectdescription_lang_' .$i),
                'sectshortdescription' => $request->input('sectshortdescription_lang_' .$i),
                'updated_at' => Carbon::now(),
                'deleted_at' => NULL
            ]
        );
    }
    return $insertSector;
    //return redirect()->route('maps.index')->with('success', 'updated');
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Наконец, благодаря Douwe de Haan, я, наконец, решил мою проблему с созданием записи с помощью сводной таблицы ... я думаю, я немного понял, как она работает сейчас

Вот метод:

public function store(Request $request)
{
    Sector::create(array(
        'admin_id' => Auth::guard('admin')->user()->id,
        'created_at' => Carbon::now(),
        'updated_at' => Carbon::now(),
    ));

    $sector = Sector::all()->last();
    $countLang = Lang::count();
    $langs = Lang::all();

    foreach ($langs as $lang) {
        $lang_id[] = $lang->id;
    }
    for ($i=0 ; $i < $countLang; $i++) {
        $insertSector[$i] = $sector->langs()->syncWithoutDetaching(
            [$lang_id[$i] =>
                [
                    'sectname' => $request->input('sectname_lang_' .$lang_id[$i]),
                    'sectname_slug' => Str::slug($request->input('sectname_lang_' .$lang_id[$i])),
                    'sectshortname' => $request->input('sectshortname_lang_' .$lang_id[$i]),
                    'sectdescription' => $request->input('sectdescription_lang_' .$lang_id[$i]),
                    'sectshortdescription' => $request->input('sectshortdescription_lang_' .$lang_id[$i]),
                    'created_at' => Carbon::now(),
                    'updated_at' => Carbon::now(),
                    'deleted_at' => NULL
                ]
            ]
        );
    }
    return redirect()->route('maps.index')->with('success', 'Secteur créé');
}

Для обновления:

public function update(Request $request, $id)
{
    $sector = Sector::findOrFail($id);
    $countLang = Lang::count();

    $langs = Lang::all();
    foreach ($langs as $lang) {
        $lang_id[] = $lang->id;
    }

    for ($i=0 ; $i < $countLang; $i++) {
        $insertSector[$i] = $sector->langs()->updateExistingPivot(
            $lang_id[$i],
                [
                    'sector_id' => $request->input('sector_id'),
                    'sectname' => $request->input('sectname_lang_' .$lang_id[$i]),
                    'sectname_slug' => Str::slug($request->input('sectname_lang_' .$lang_id[$i])),
                    'sectshortname' => $request->input('sectshortname_lang_' .$lang_id[$i]),
                    'sectdescription' => $request->input('sectdescription_lang_' .$lang_id[$i]),
                    'sectshortdescription' => $request->input('sectshortdescription_lang_' .$lang_id[$i]),
                    'updated_at' => Carbon::now(),
                    'deleted_at' => NULL
                ]

        );
    }
    return $insertSector;
    //return redirect()->route('sectors.index')->with('success', 'Secteur mis à jour');
}
0 голосов
/ 24 апреля 2018

Документация гласит следующее:

При присоединении отношения к модели вы также можете передать массив дополнительных данных для вставки в промежуточную таблицу:

$user->roles()->attach($roleId, ['expires' => $expires]);

Вы правильно поняли эту часть.Теперь для обновления (и / или удаления):

Удаление

$user->roles()->detach([1, 2, 3]);

Это удаляет связанные записи и очищает промежуточную таблицу.

Синхронизация ассоциаций

Вы также можете использовать метод синхронизации для построения ассоциаций «многие ко многим».Метод синхронизации принимает массив идентификаторов для размещения в промежуточной таблице.Любые идентификаторы, которых нет в данном массиве, будут удалены из промежуточной таблицы.Таким образом, после завершения этой операции в промежуточной таблице будут существовать только идентификаторы в данном массиве:

$user->roles()->sync([1, 2, 3]);

Вы также можете передать дополнительные значения промежуточной таблицы с идентификаторами:

$user->roles()->sync([1 => ['expires' => true], 2, 3]);

Если вы не хотите отсоединять существующие идентификаторы, вы можете использовать метод syncWithoutDetaching:

$user->roles()->syncWithoutDetaching([1, 2, 3]);

Заключение

Использовать синхронизацию и заново установить атрибуты.Если вы просто хотите обновить несколько записей, используйте syncWithoutDetaching.

Обновление

Измените код обновления следующим образом:

$insertSector[$i] = $sector->langs()->sync(
    $lang_id => 
    [
        'sectname' => $request->input('sectname_lang_' .$i),
        'sectname_slug' => Str::slug($request->input('sectname_lang_' .$i)),
        'sectshortname' => $request->input('sectshortname_lang_' .$i),
        'sectdescription' => $request->input('sectdescription_lang_' .$i),
        'sectshortdescription' => $request->input('sectshortdescription_lang_' .$i),
        'updated_at' => Carbon::now(),
        'deleted_at' => NULL
    ]
);

Вы передали sector->id и $lang_id, где вам нужно было только передать $lang_id с атрибутами для промежуточной таблицы.

...