Laravel Backpack: Хранение отношений, принадлежащих многим, с использованием настраиваемого представления

У меня есть класс полета, и у этого полета есть настраиваемое поле просмотра, например:

введите здесь описание изображения

Это представляет собой принадлежность ко многим отношениям, которые хранят website_id / flight_id и цены как сводные данные в сводной таблице.

Пользовательское представление использует JS для отправки этих данных обратно в контроллер в следующем формате:

{"1":{"price_adult":"434","price_child":"545"},"2":{"price_adult":"323","price_child":"324"},"3":{"price_adult":"434","price_child":"43"}}

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

Может ли кто-нибудь указать, как лучше всего действовать и есть ли поддержка для этого? Я просмотрел документы, но они ужасно короткие и неоднозначные с точки зрения того, что могут сильно помочь.

РЕДАКТИРОВАТЬ: Я должен был сказать, что я, вероятно, могу выполнить эту работу, используя настраиваемый атрибут имени в модели для отношения, а затем добавить набор мутаторов, чтобы зациклить эти данные и обновить отношение цен, но я не хочу идти по этому маршруту, если для этого есть поддержка, которую мне не хватает из коробки в рюкзаке.

РЕДАКТИРОВАТЬ2:

Кто-то спросил об отношении:

$this->belongsToMany(Website::class, 'website_pricing')->withPivot('price_adult', 'price_child');

Это работает нормально, это не проблема с работой отношения, как я могу получить рюкзак для хранения данных как отношения, когда у рейса еще нет идентификатора, или как я могу передать данные, которые я опубликовал выше, таким образом, чтобы рюкзак Контроллер crud может справиться с этим?


person Sam    schedule 12.10.2017    source источник


Ответы (2)


Если идентификатор рейса не указан, вам может потребоваться сначала создать рейс. Не могли бы вы подробнее объяснить реляционную структуру базы данных?

person Raza Mehdi    schedule 12.10.2017
comment
Это должен быть комментарий, а не ответ. - person Khoon; 12.10.2017
comment
Отношение просто принадлежит многим, у которых есть сводные значения, проблема не в отображении этих данных, которые я сделал. Вопрос в том, поддерживает ли это рюкзак, и если да, то как? потому что я могу взломать способ заставить это работать, но если он поддерживается рюкзаком каким-то образом, не задокументированным (как и многие его функции), как мне его использовать? - person Sam; 12.10.2017

В основном думал, что я должен опубликовать то, что я сделал, потому что никто не мог дать ответ на это.

Итак, в основном вам нужно скопировать функции хранения / обновления из родительского, изменив несколько строк.

    $this->crud->hasAccessOrFail('create');

    // fallback to global request instance
    if (is_null($request)) {
        $request = \Request::instance();
    }

    // replace empty values with NULL, so that it will work with MySQL strict mode on
    foreach ($request->input() as $key => $value) {
        if (empty($value) && $value !== '0') {
            $request->request->set($key, null);
        }
    }

    // insert item in the db
    $item = $this->crud->create($request->except(['save_action', '_token', '_method']));
    $this->data['entry'] = $this->crud->entry = $item;

    // show a success message
    \Alert::success(trans('backpack::crud.insert_success'))->flash();

    // save the redirect choice for next time
    parent::setSaveAction();

    return parent::performSaveAction($item->getKey());

По сути, любая строка, которая ссылается на функцию в родительском классе с использованием $this->method, должна быть изменена на parent::

Эта строка - это то, что я использовал для отправки строки JSON отношений, переданной контроллеру как отношения $item->prices()->sync(json_decode($request->input('prices'), true));

Это делается после того, как в этот момент будет доступна строка, содержащая $item = $this->crud->create в качестве только что сохраненного идентификатора элемента.

person Sam    schedule 18.10.2017