Найдите одну запись во многих и отредактируйте - PullRequest
0 голосов
/ 03 мая 2018

[НАСТРОЙКА]

  • Symfony 3.4
  • Box сущность: ['id', 'name']
  • Item сущность ['id', 'name', 'type']
    • type: enum :: игрушка, открытка, конфета
  • BoxItem объект: ['id', 'box_id', 'item_id']
    • У каждого Box всегда есть один item, у которого type есть игрушка
    • Каждый Box всегда имеет по одному item, чья type равна карточке
    • Каждый Box может иметь ноль или более (0, n) item, у которых type равно , конфеты

[ПРОБЛЕМА И ФАЙЛЫ]

У меня есть OneToMany <=> ManyToOne отношение между моими тремя сущностями, BoxItem является средним.
Когда я сохраняю Box, некоторые значения по умолчанию сохраняются в BoxItem.

Моя проблема в том, что когда я хочу отредактировать данные в BoxItem, я не могу понять, как получить нужные мне данные.

Мне нужен editAction(), который мы назовем toyAction() для редактирования текущей предварительно выбранной игрушки, и еще один для редактирования предварительно выбранной карты.
Конфеты просто добавляются или удаляются.

Может ли кто-нибудь дать мне пример того, как мне нужно написать toyAction(), чтобы я мог получить единственный связанный с ним `item ['toy]' и изменить его?

Это мой текущий toyAction()

BoxItemController

/**
 * @Route("boxitem-toy-{boxId}", name="boxitem_toy")
 * @ParamConverter("boxItem", options={"box"="boxId"})
 * @Method({"GET", "POST"})
 *
 * @param Request $request
 * @param BoxItem $boxItem
 *
 * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
 */
public function toyAction(Request $request, BoxItem $boxItem) {
    $editForm=$this->createForm(BoxItemToyType::class, $boxItem);
    if($request->isMethod('POST')) {
        if($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->json(array('submit_status'=>true));
        } else {
            return $this->json(array('submit_status'=>false));
        }
    } else {
        return $this->render('boxitem/toy.html.twig', array(
            'boxItem'=>$boxItem,
            'edit_form'=>$editForm->createView(),
        ));
    }
}

Существуют как минимум две проблемы с текущим кодом.

Во-первых, в аннотации @ParamConverter box не распознается. Я предполагаю, что причина в том, что атрибут box является отношением OneToMany <=> ManyToOne, и поэтому я не использую правильный синтаксис. Я попытался box_id вместо этого, но я все еще получаю ту же ошибку.

Исключение было сгенерировано во время рендеринга шаблона ("Неверные параметры переданы @ParamConverter: box").

Во-вторых, я ищу каждую запись с правом box_id, мне нужно расширить поиск и присоединиться к Item, чтобы получить единственную запись, для атрибута type которой будет установлено значение игрушка и вернуть одну запись или ноль.

1 Ответ

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

Так что, если мы будем поддерживать ваши ассоциации (с комментариями), я бы подошел к этому следующим образом.

 /**
 * @Route("boxitem-toy-{box}", name="boxitem_toy")
 * @Method({"GET", "POST"})
 */
 public function toyAction(Request $request, Box $box) {
    $toyBoxItem = null;
    foreach ($box->getItems() as $item) { // Iterate though all items
        if ($item->getType() == 'Card') { // Your check if this is card item... 
            $toyBoxItem = $item;
            break;
        }
    }

    if ($toyBoxItem == null) {
        throw new NotFoundException(); // We dont have item
    }

    // ... rest of your code
}

Чтобы объяснить это. Поскольку у нас есть Box в качестве параметра и мы загружаем его по id, то нам не нужен ParamConverted, он должен его найти.

Далее нам нужно получить ToyItem (я написал это здесь в функции, но на самом деле хорошая идея переместить этот код в Entity / Service - что-то вроде $box->getToyItem() ...).

Далее, в качестве параметра этого вы получаете не BoxItem, а связанный объект Box, из которого вы получаете свой объект. Похоже на карточку действия.

...