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,并让实体代码填充当前实例连接的另一端。
这与其说是问题不如说是问题。 我有 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,并让实体代码填充当前实例连接的另一端。