php symfony如何自动将外键转换为实体?

o8x7eapl  于 11个月前  发布在  PHP
关注(0)|答案(1)|浏览(77)

我刚刚开始在PHP Symfony与现有的项目。该项目已部署,并且可以正常工作,但在不同的本地环境中,某些端点会出现一些奇怪的情况,这些端点涉及外键列表(多对多),我无法弄清楚。所以我有一个实体人谁可以拥有多个房子(多对多),并有一个主要的房子。创建person时,作为外键的house与person一起传递,如下所示:

{
   "name": "John Doe",
   "mainHouse": 62,
   "houses": [62]
  }

在更正后的版本中,JSON对象由三个键值对组成:“name”具有值“John Doe”,“mainHouse”具有值62,“houses”具有包含数字62的数组。
在个人实体中,一切似乎都定义得很好:

class Person
{ 
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity=House::class, inversedBy="owners")
     * @ORM\JoinTable(name="person_house")
     */
    private $houses;

 /**
     * @ORM\ManyToOne(targetEntity=House::class)
     */
    private $mainHouse;
   .
   .
   .
}

以及表单定义的类型类:

class PersonType extends AbstractType
{
  .
  .
  ->add('houses', EntityType::class, [
                'required' => true,
                'multiple' => true,
                'class' => House::class
            ])
  ->add('mainHouse', EntityType::class, [
                'required' => true,
                'class' => House::class
            ])
  .
  .
}

创建Person的控制器如下所示:

public function createPerson(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $person = new Person();
        $content = json_decode($request->getContent(), true);
        $form = $this->createForm(PersonType::class, $person);
        $form->submit($content);

        if ($form->isValid()) {
            $em->persist($person);
            $em->flush();

            return $person;
        }

        return $form;

我的问题是每次我传递一个房子列表的外键,即使它们存在于数据库中,我在$form->isValid()行上得到一个错误的请求(Validation failed),其中“this value is not valid”用于属性houses,而不是mainHouse。对于所有其他类型list的属性,都是这样的,它们接受一个外键列表。总的来说,我还没有弄清楚symfony是如何在请求体中找到这些外键并将它们转换为实体的,以及为什么简单的值不适用于列表。我搜索了ParamConverters和DataTransformers,但在我的项目中没有看到任何与之相关的东西。我需要做些什么来激活此功能吗?

gtlvzcf8

gtlvzcf81#

我通过降级PHP版本解决了这个问题。我有PHP v8.2.5,降级到PHP v8.0.29。我没有看到 composer 安装软件包不兼容的错误信息,只是运行 composer 安装,直到我使用PhpStorm提示 composer 安装,这表明一些软件包与我的PHP版本不兼容,因此降级。

相关问题