You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony表单报错:IdReader::getIdValue()参数应为对象或null,传入字符串

解决Symfony中EntityType表单关联Category时的IdReader错误

错误场景与提示

编辑博客文章时,为BlogType添加关联Category的EntityType表单后,触发以下错误:

Argument 1 passed to Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue() must be an object or null, string given
控制器中调用dd($post)时触发该错误。

问题代码

BlogType表单配置

->add('category', EntityType::class, [
    'class' => Category::class,
    'choice_label' => function(Category $category) {
        return $category->getName();
    }
])

Category实体关键代码

/**
 * @ORM\Column(type="string", length=255)
 */
private $name;

public function __toString() {
    return $this->name;
}

public function getId(): ?int
{
    return $this->id;
}

public function getName(): ?string
{
    return $this->name;
}

控制器代码

/**
 * @Route("/edit-post/{id}", name="edit-post")
 */
public function editBlogPost(ManagerRegistry $manager, $id){
    $post = $manager->getRepository(Blog::class)->find($id);
    $form = $this->createForm(BlogType::class, $post);
    $form->handleRequest($request);
    dd($post);
}

解决方案

1. 修正Blog实体的Category关联定义

确保Blog实体中category字段是正确的Doctrine ManyToOne关联,而非普通字符串字段:

// Blog.php
/**
 * @ORM\ManyToOne(targetEntity=Category::class)
 * @ORM\JoinColumn(nullable=false)
 */
private $category;

// 补充对应的getter和setter
public function getCategory(): ?Category
{
    return $this->category;
}

public function setCategory(?Category $category): self
{
    $this->category = $category;
    return $this;
}

2. 检查并修复数据库数据

确认blog表的category字段存储的是Category的ID(整数类型),而非分类名称字符串。若之前错误存储了名称,需批量更新数据,将对应分类的ID填入该字段。

3. 补充控制器的Request依赖注入

控制器方法中缺失Request $request参数,导致handleRequest调用失败,需修正:

public function editBlogPost(ManagerRegistry $manager, Request $request, $id){
    $post = $manager->getRepository(Blog::class)->find($id);
    $form = $this->createForm(BlogType::class, $post);
    $form->handleRequest($request);
    dd($post);
}

4. 验证Category实体主键配置

确保Category实体的主键$id是正确的自增主键定义:

// Category.php
/**
 * @ORM\Id
 * @ORM\GeneratedValue
 * @ORM\Column(type="integer")
 */
private $id;

内容的提问来源于stack exchange,提问作者steven zong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:05:23