Doctrine :需要调用 set 或添加多对一关系?

Doctrine : need to call set or add in many to one relation?

这与其说是问题不如说是问题。 我有 2 个通过多对一关系关联的实体:

class TestScore {
[...]
    /**
     * @ORM\ManyToOne(targetEntity="Modules\TestBundle\Entity\TestUser" , cascade={"persist"}, inversedBy="scores")
     * @ORM\JoinColumn(name="test_user_id", onDelete="CASCADE")
     */
    private $testUser;
[...]
}

class TestUser {
[...]
/**
 * @ORM\OneToMany(targetEntity="Modules\TestBundle\Entity\TestScore" , cascade={"persist"}, mappedBy="testUser")
 */
private $scores;
[...]
}

在服务中,我有类似的东西:

    public function createScore(TestUser $testUser, string $code, $score, string $description = null) {
            $testScore = new TestScore();
            $testScore->setTestUser($testUser);
            $testScore->setCode($code);
            $testScore->setScore($score);
            $testScore->setDescription($description);
    
            $this->em->persist($testScore);
        }

In this case, if I make something like :

$scoringService->createScore($testUser, 'total', $totalActivity);
dump($em->getRepository(TestScore::class)->findBy('testUser' => $testUser));
dump($testUser->getScores());

我的第一个转储 return 1 个具有正确数据的 TestScore 和我的第二个 return 空值!

但是如果我加上

$testUser->addScores($testScore);

$scoringService->createScore(),我的第二次转储 return 正确的数据。

我认为 doctrine 会自动将分数添加到 testUser 而 $testScore->setTestUser($testUser);

有人可以向我确认一下吗? 谢谢!!

Doctrine 会自动 creates/populates 从数据库加载这种数据时双方的连接(即,如果您在其他某个点再次加载用户,它将链接 testScore 实例)。

但是当您最初创建实体并设置引用时,如果您想立即对同一对象使用引用,则需要在两侧执行 set/add。一个相当标准的解决方案(例如由 symfony 实体生成器使用)是在 oneToMany 侧添加方法中设置引用的两侧,如:

public function addScores(TestScore $testScore): self
{
    if (!$this->testScores->contains($testScore)) {
        $this->testScores[] = $testScore;
        $testScore->setTestUser($this);
    }

    return $this;
}

这样,您只需从您的服务中调用 addScores,并让实体代码填充当前实例连接的另一端。