我正在尝试使用原则构建 SQL 查询。这是我的代码片段:
/**
* @Route("/db", name="user_skill_testing")
*/
public function dbTest()
{
//all skills for user
$userName = "Jelle";
$user = $this->getDoctrine()
->getRepository('AppBundle:User')
->findOneByFirstname($userName);
echo "userId: ".$user->getId()."<br />";
$userSkills = $this->getDoctrine()
->getRepository('AppBundle:Userskill')->findById($user->getId());
$proficiencies = array();
foreach ($userSkills as $userSkill) {
array_push($proficiencies, $userSkill);
echo $userSkill->getId();
echo "-";
echo $userSkill->getProficiency()->getId();
echo "<br />";
}
var_dump($userSkills);
$html = "<html><body>".$user->getFirstname()."<br /><br />"."</body></html>";
return new Response($html);
}
当我查看它运行的查询时......:
...然后重新运行它们...:
...我得到了非常不同的结果。 :( 我不知道为什么,有人可以帮助我吗? 谢谢!
编辑:使用此代码构建查询会产生相同的结果。
问题在于你在
UserSkill
上的PK。当学说水合时,它将假设具有相同主键的实体是同一实体,如果已经水合,则忽略具有相同 PK 的行。
由于您的
Userskill::$id
不是唯一的,因此只有第一个会被水合,具有相同 id 的后续行将获得对同一实体的引用。
要解决此问题,您需要创建一个复合键,由
id
和 proficiencyId 组成。
但在您的用例中,这将使事情变得不切实际。因此,我只需将
Userskill
上的手动 id 替换为从 User
到 Userskill
的实际一对多关系...
让 MySql 生成多对多关系有助于原则生成正确的实体。