Синхронизация сводной таблицы laravel не работает должным образом при обновлении нескольких полей - PullRequest
0 голосов
/ 17 июня 2019

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

Моя сводная таблица содержит следующие поля

  • page_id
  • product_id
  • tab_id

Данные, отправленные в моей форме, представлены следующим образом:

Array
(
    [page] => 1
    [product_ids] => Array
    (
        [1] => Array
        (
            [0] => 818051BEC7ECC6715FDDF1F895350677
        )

        [2] => Array
        (
            [0] => a0e2a2c563d57df27213ede1ac4ac780
            [1] => 8a1e808b55fde9455cb3d8857ed88389
        )

        [3] => Array
        (
            [0] => C8CCE4FED350D439C90EAEA7C43321EC
            [1] => f4dd765c12f2ef67f98f3558c282a9cd
            [2] => 5055cbf43fac3f7e2336b27310f0b9ef
        )

        [4] => Array
        (
            [0] => 456ac9b0d15a8b7f1e71073221059886
            [1] => 7fec306d1e665bc9c748b5d2b99a6e97
            [2] => db576a7d2453575f29eab4bac787b919
            [3] => 6c340f25839e6acdc73414517203f5f0
        )
    )
)

Я хочу синхронизировать идентификаторы продуктов со своей страницей и использоватьключи для product_ids в поле tab_id.

Вот мой метод хранения.(примечание: я намеренно помещаю команду exit; в конце, чтобы я мог многократно обновлять страницу и отправлять одни и те же данные без необходимости каждый раз заполнять форму.

public function store(Request $request)
{
    $page = Page::find($request->input('page));
    $product_ids = $request->input('product_ids');

    if ($page)
    {
        $syncData = [];

        foreach ($product_ids as $tab => $products)
        {
            $data = array_map(function ($item) use ($tab)
            {
                $arr = [
                    'tab_id'      => $tab,
                    'product_id' => $item,
                ];
                return $arr;
                }, $products);

            $syncData = array_merge($syncData, $data);
        }

        $page->products()->sync($syncData);
    }
    exit;
}

Если вывести $syncData на страницу непосредственно перед синхронизацией, я вижу следующее

Array
(
    [0] => Array
    (
        [tab_id] => 1
        [product_id] => 818051BEC7ECC6715FDDF1F895350677
    )

    [1] => Array
    (
        [tab_id] => 2
        [product_id] => a0e2a2c563d57df27213ede1ac4ac780
    )

    [2] => Array
    (
        [tab_id] => 2
        [product_id] => 8a1e808b55fde9455cb3d8857ed88389
    )

    [3] => Array
    (
        [tab_id] => 3
        [product_id] => C8CCE4FED350D439C90EAEA7C43321EC
    )

    [4] => Array
    (
        [tab_id] => 3
        [product_id] => f4dd765c12f2ef67f98f3558c282a9cd
    )

    [5] => Array
    (
        [tab_id] => 3
        [product_id] => 5055cbf43fac3f7e2336b27310f0b9ef
    )

    [6] => Array
    (
        [tab_id] => 4
        [product_id] => 456ac9b0d15a8b7f1e71073221059886
    )

    [7] => Array
    (
        [tab_id] => 4
        [product_id] => 7fec306d1e665bc9c748b5d2b99a6e97
    )

    [8] => Array
    (
        [tab_id] => 4
        [product_id] => db576a7d2453575f29eab4bac787b919
    )

    [9] => Array
    (
        [tab_id] => 4
        [product_id] => 6c340f25839e6acdc73414517203f5f0
    )
)

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

Однако, если я обновлю страницу (снова отправив форму), некоторые строки исчезнут из сводной таблицы. В итоге получится шесть строк, а не десять. Значенияоставшиеся верны, но четыре отсутствуют.

Очистка сводной таблицы и повторная попытка дают точно такие же результаты. Я заметил, что если я изменю значения product_ids, удаляется другое количество. Иногда яосталось 8 строк, но снова меняя значения, я могу остаться с 7.

Чего мне не хватает?

...