无法在API POST-call中包含实体集合



有问题的错误:

Entity of type AppEntityNutt is missing an assigned ID for field  'squirrel'.
The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called.
If you want automatically generated identifiers instead you need to adjust the metadata mapping accordingly.

我完全能够调用api POST将Squirrel实体添加到数据库中。使用这个Squirrel的id,我可以为Nutt实体预生成POST调用,结果是Nutt选项卡中正确相关的记录。

我似乎做不到的是允许Squirrel api调用包含我想在同一个api调用中插入的Nutts的相关集合。

我做错了什么?

JSON调用:

{
"name": "Jake",
"nutts": [
{
"size": 10,
"color": "blue"
}
]
}

实体松鼠

/**
* @ORMEntity
* @ORMTable(name="squirrel")
*/
class Squirrel {
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="string", length=100)
* @AssertNotBlank()
*
*/
private $name;
/**
* @ORMOneToMany(targetEntity="AppEntityNutt", mappedBy="squirrel", cascade={"persist", "remove"})
*/
private $nutts;
public function __construct()
{
$this->nutts = new DoctrineCommonCollectionsArrayCollection();
}
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getNutts(): ?Collection
{
return $this->nutts;
}
public function setNutts(Collection $nutts)
{
foreach ($nutts as $nutt)
{
$this->nutts->add($nutt);
}
}
public function addNutt(Nutt $nutt): Squirrel
{
$this->nutts->add($nutt);
return $this;
}
}

实体松鼠已更新
setNutts已更改为:

public function setNutts(Collection $nutts)
{
foreach ($nutts as $nutt)
{
$nutt->setSquirrel($this);
$this->nutts->add($nutt);
}
}

实体Nutt

/**
* @ORMEntity
* @ORMTable(name="nutt")
*/
class Nutt {
/**
* @ORMManyToOne(targetEntity="AppEntitySquirrel", inversedBy="nutts")
* @ORMId
*/
private $squirrel;
/**
* @ORMColumn(type="integer")
* @ORMId
*/
private $size;
/**
* @ORMColumn(type="text")
* @AssertNotBlank()
*/
private $color;
/**
* @return Squirrel|null
*/
public function getSquirrel(): ?Squirrel
{
return $this->squirrel;
}
/**
* @param Squirrel|null $squirrel
* @return $this
*/
public function setSquirrel(?Squirrel $squirrel): self
{
$this->squirrel = $squirrel;
return $this;
}
//getters and setters for the rest
}

实体Nutt已更新。属性$squirle的id标记被删除,因为它是一个关系:

/**
* @ORMManyToOne(targetEntity="AppEntitySquirrel", inversedBy="nutts")
*/
private $squirrel;

松鼠控制器

/**
* Squirrel controller.
* @Route("/api", name="api_")
*/
class SquirrelController extends AbstractFOSRestController
{
/**
* Lists all Squirrels.
* @RestGet("/squirrels")
* @return Response
*/
public function getSquirrelAction()
{
$repository = $this->getDoctrine()->getRepository(Squirrel::class);
$squirrels = $repository->findall();
return $this->handleView($this->view($squirrels));
}
/**
* Create Squirrel.
* @RestPost("/squirrel")
*
* @return Response
*/
public function postSquirrelAction(Request $request)
{
$squirrel = new Squirrel();
$form = $this->createForm(SquirrelType::class, $squirrel);
$data = json_decode($request->getContent(), true);
$form->submit($data);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($squirrel);
$em->flush();
return $this->handleView($this->view(['status' => 'ok'], Response::HTTP_CREATED));
}
return $this->handleView($this->view($form->getErrors()));
}
}

以及我目前的关注点松鼠形态

class SquirrelType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add(
'nutts',
CollectionType::class, [
'entry_type' => NuttType::class,
'allow_add' => true,
'by_reference' => false
])
->add('save', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Squirrel::class,
'csrf_protection' => false
));
}
}

有一种坚果形式,但效果很好。

问题已由@mel在评论中解决

Id注释将列声明为主键,因此它成为必需的。但在这种情况下不需要它,因为squirrel是一个关系。

错误本身也提示在保存实体时字段为null,因此不会调用setSquirrel

您也可以从size中删除注释。

最新更新