首页 > 解决方案 > Symfony OneToMany 与关联数组:插入新行而不是更新

问题描述

我必须国际化一个应用程序,特别是一个名为 Program 的实体。为此,我创建了另一个实体 ProgramIntl,其中包含“语言环​​境”属性(en_GB、fr_FR 等)和必须国际化的字符串。我希望 Program 中的 programIntl 属性是一个关联数组(以语言环境为键)。

我们有一个 API 来读/写程序。GET 和 POST 工作正常,但是当我想更新数据(PUT)时,programIntl 没有更新:一个插入查询被启动(并且由于唯一约束而失败,但这不是问题)。

这是代码:

在 Program.php 中:

 /**
 * @var
 *
 * @ORM\OneToMany(targetEntity="ProgramIntl", mappedBy="program", cascade={"persist", "remove", "merge"}, indexBy="locale", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false, onDelete="cascade")
 * @Groups({"program_read", "program_write"})
 */
private $programIntl;

public function addProgramIntl($programIntl)
{
    $this->programIntl[$programIntl->getLocale()] = $programIntl;
    $programIntl->setProgram($this);

    return $this;
}

public function setProgramIntl($programIntls)
{
    $this->programIntl->clear();
    foreach ($programIntls as $locale => $programIntl) {
        $programIntl->setLocale($locale);
        $this->addProgramIntl($programIntl);
    }
}

public function getProgramIntl()
{
    return $this->programIntl;
}

在 ProgramIntl.php 中:

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProgramIntlRepository")
 * @ORM\Table(name="program_intl",uniqueConstraints={@ORM\UniqueConstraint(name="program_intl_unique", columns={"program_id", "locale"})})
 */
class ProgramIntl
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups({"program_read", "program_write"})
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Program", inversedBy="programIntl")
     * @ORM\JoinColumn(nullable=false)
     */
    private $program;

    /**
     * @ORM\Column(type="string", length=5, options={"fixed" = true})
     */
    private $locale;

    /**
     * @ORM\Column(type="string", length=64)
     * @Assert\NotBlank()
     * @Groups({"program_read", "program_write"})
     */
    private $some_attr;

    /* ... */
}

知道“插入”而不是“更新”的原因可能是什么吗?

谢谢

标签: symfonydoctrineone-to-many

解决方案


我忘了提到我们使用 api-platform。但我自己找到了解决方案。如果有人感兴趣,在 Program 和 ProgramIntl 类中添加以下注释可以解决问题: /* @ApiResource(attributes={ * "normalization_context"={"groups"={"program_read", "program_write"}}, * " denormalization_context"={"groups"={"program_read", "program_write"}} * }) */


推荐阅读