Вставка один ко многим на неправильный стол - PullRequest
0 голосов
/ 17 мая 2019

У меня есть одно отношение, у которого одна таблица называется " Category ", а другая - " Beer ", когда я пытался создать новое пиво с категорией api, которая выдает мне ошибку .

BeerController

/**
 * @Route("/", methods={"POST"})
 * @param  Request $request
 * @return Response
 */
public function saveAction(Request $request){

    $data_arr = json_decode($data = $request->getContent(),true);
    $beer = new Beer();
    $category = new Category();

    $beer->getCategory();
    $form = $this->createForm(BeerType::class, $beer);
    $form->submit($data_arr);

    $beer->setCategory($category);
    $doctrine = $this->getDoctrine()->getManager();
    $doctrine->persist($category);
    $doctrine->merge($beer);
    $doctrine->flush();
    return new JsonResponse([$data_arr], 200);
}

BeerEntity

/**
 * Beer
 *
 * @ORM\Table(name="beers")
 * @ORM\Entity
 */
class Beer
{

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="beer", cascade={"persist", "remove" }))
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;

    /**
     * @return mixed
     */
    public function getCategory()
    {
        return $this->category;
    }

    /**
     * @param mixed $category
     */
    public function setCategory($category)
    {
        $this->category = $category;
    }

}

CategoryEntity

class Category
{
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Beer", mappedBy="category")
     */
    private $beer;

    public function __construct()
    {
        $this->beer = new ArrayCollection();
    }
}

BeerType (форма)

class BeerType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array 
    $options)
    {
        $builder->add('name')
            ->add('description')
            ->add('price')
            ->add('slug')
            ->add('type')
            ->add('abv')
            ->add('brewedby')
            ->add('createdat')
            ->add('updatedat')
            ->add('category', EntityType::class, [
                    'class' => Category::class
                ]) 
   ;

console.log (ошибка)

"Возникла исключительная ситуация при выполнении категории INSERT INTO (имя) ЗНАЧЕНИЯ (?) 'С params [null] " SQLSTATE [23000]: нарушение ограничения целостности: 1048 «имя» столбца не может быть нулевым "

Как говорит сама проблема, когда я пытался создать новое пиво с категорией (уже созданной), контроллер пытается создать новую категорию, но я хочу создать новое пиво с уже созданной категорией.

Edit:

Когда я отправляю данные с пива через API, категория отправляется нормально, но когда я пытаюсь добавить пиво с помощью get, категория не больше на пиве.

Почтовое пиво

{abv: 7, brewedby: "Péttrin Miranda Souza", category_id: "7", description: "Descrição da cerva",…}
abv: 7
brewedby: "Péttrin Miranda Souza"
category_id: "7"
description: "Descrição da cerva"
name: "Beer"
price: "25"
slug: "mugger"
type: "Cerveja bavaria"

Пиво

5: {id: 19, name: "Beer", description: "Descrição da cerva", price: 25, slug: "mugger",…}
abv: 7
brewedby: "Péttrin Miranda Souza"
createdat: "2019-05-20T09:28:08-03:00"
description: "Descrição da cerva"
id: 19
name: "Beer"
price: 25
slug: "mugger"
type: "Cerveja bavaria"
updatedat: "2019-05-20T09:28:08-03:00"

1 Ответ

1 голос
/ 17 мая 2019

Поскольку у вас уже есть объект категории, выбранный в форме, нет необходимости создавать экземпляр объекта категории или сохранять это в вашем действии (возникшая ошибка возникает из-за создания нового экземпляра и его сохранения - вместо использования существующей категорииссылка, которая связана с сущностью пива в форме привязки данных).Вы можете попробовать следующую версию действия:

/**
 * @Route("/", methods={"POST"})
 * @param  Request $request
 * @return Response
 */
public function saveAction(Request $request){

    $doctrine = $this->getDoctrine()->getManager();

    $data_arr = json_decode($data = $request->getContent(),true);
    $beer = new Beer();

    $form = $this->createForm(BeerType::class, $beer);
    $form->submit($data_arr);

    $category = $doctrine->getRepository(Category::class)->find($data_arr['category_id']);
    $beer->setCategory($category);

    $doctrine->persist($beer);
    $doctrine->flush();

    return new JsonResponse([$data_arr], 200);
}

Обновлен ответ после дополнительных комментариев.Так что теперь категория явно выбирается на основании заданного идентификатора параметра.Другое решение - когда предыдущий простой код контроллера без какой-либо специальной выборки для категории - заключалось бы в использовании преобразователя данных формы ( symfony data transormer ), который автоматически отображал бы int id в объект категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...