我在 symfony 中使用原则时得到了错误的数据

问题描述 投票:0回答:2

我正在尝试使用原则构建 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);
}

它返回以下网页(截图): enter image description here

当我查看它运行的查询时......:

enter image description here

...然后重新运行它们...:

enter image description here

...我得到了非常不同的结果。 :( 我不知道为什么,有人可以帮助我吗? 谢谢!

编辑:使用此代码构建查询会产生相同的结果。

enter image description here

php mysql symfony doctrine
2个回答
1
投票

问题在于你在

UserSkill
上的PK。当学说水合时,它将假设具有相同主键的实体是同一实体,如果已经水合,则忽略具有相同 PK 的行。

由于您的

Userskill::$id
不是唯一的,因此只有第一个会被水合,具有相同 id 的后续行将获得对同一实体的引用。

要解决此问题,您需要创建一个复合键,由

id
proficiencyId 组成。

但在您的用例中,这将使事情变得不切实际。因此,我只需将

Userskill
上的手动 id 替换为从
User
Userskill
的实际一对多关系...


0
投票

让 MySql 生成多对多关系有助于原则生成正确的实体。

© www.soinside.com 2019 - 2024. All rights reserved.