gpt4 book ai didi

php - symfony2 Doctrine - 将 child 添加到 self 相关的实体

转载 作者:可可西里 更新时间:2023-11-01 13:26:00 25 4
gpt4 key购买 nike

我有一个与自身相关的实体。该实体具有字段:parentchildren

class A
{
// ...

/**
* @var A
* @ORM\ManyToOne(targetEntity="A", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
protected $parent;

/**
* @var A[]
* @ORM\OneToMany(targetEntity="A", mappedBy="parent", cascade={"all"}, orphanRemoval=true)
*/
protected $children;
}

我想通过在表单中​​设置 child 来为这个实体添加 child 。该实体类型如下所示:

class AType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('children', 'collection', [
'type' => new AType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'prototype' => true,
])
;
}
}

当我像这样发送数据时:

'a' => [
[
'name' => 'main a',
'children' => [
[
'name' => 'child a 1',
],
[
'name' => 'child a 2',
],
],
],
],

(在测试中,我没有 View ,因为这个应用程序是基于完整的 REST Api 通信)我收到此错误:

PHP Fatal error: Maximum function nesting level of '100' reached, aborting!

那么,是否有可能将 child 添加到 self 相关的实体中?

如果我有 2 个实体,它会工作:实体 A 和与实体 B 相关的子字段。但是,它可以处理这种关系吗?

我是否应该将 AType 类中的 typenew AType() 更改为其他内容。

编辑:其实我只是想获取数据并验证它。我不需要 HTML 表单来显示它。我可以这样做:

// controller
$jms = $this->get('jms_serializer');
$entity = $jms->deserialize($request->getContent(), 'AcmeBundle\Entity\A', 'json');

$this->em->persist($entity);
$this->em->flush();

不在 Controller 中使用 Form。但在这种情况下,我的数据将不会得到验证。

最佳答案

PHP Fatal error: Maximum function nesting level of '100' reached, aborting!

因为你有递归。当您调用 createForm 时,它会尝试解析 type

这部分代码可以在FormFactory函数resolveType中找到。

我认为您可以创建第二种表单类型,其中包括 titleparent

class AType extends AbstractType{
//...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('parent')
->add('children', 'collection', array(
'type' => new BType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'prototype' => true
));
}
}

class BType extends AbstractType {
//..
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('parent');
}
}

我认为表单生成器可以获取和映射 Content-Type:application/x-www-form-urlencoded。我已经用 html 形式实现了。我也尝试发送 application/json 但结果不成功。这就是您可以在此处使用 json 模式验证器的原因。

关于php - symfony2 Doctrine - 将 child 添加到 self 相关的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com