Symfony DQL原则不';t设置为自动连接

Symfony DQL原则不';t设置为自动连接,symfony,doctrine,dql,Symfony,Doctrine,Dql,我想如果我不想覆盖关系的on条件,我只需要使用WITH来添加一个附加条件。我不确定我的映射是否错误,但是在WITH中没有join条件的DQL会进行交叉连接 这里是我的实体关系(Symfony): 电影: /** * @ORM\OneToMany(targetEntity="MovieInterest", mappedBy="movie") */ private $movieInterests; 电影权益: /** * @ORM\ManyToOne(targetEntity="Movie"

我想如果我不想覆盖关系的on条件,我只需要使用WITH来添加一个附加条件。我不确定我的映射是否错误,但是在WITH中没有join条件的DQL会进行交叉连接
这里是我的实体关系(Symfony):

电影:

/**
 * @ORM\OneToMany(targetEntity="MovieInterest", mappedBy="movie")
 */
private $movieInterests;
电影权益:

/**
 * @ORM\ManyToOne(targetEntity="Movie", inversedBy="movieInterests")
 */
private $movie;
以下是我在MovieInterestRespository中的查询:

public function deleteByMovieId($id, $user)
{
    $em = $this->getEntityManager();
    $result = $em->createQuery(
        "SELECT mi FROM CineupsWebAppBundle:MovieInterest mi
         JOIN CineupsWebAppBundle:Movie m WITH m.id=mi.movie
            WHERE m.id=".$id." AND mi.user=".$user->getId())
        ->getResult();

    foreach ($result as $entity) {
        $em->remove($entity);
    }

    $em->flush();
}
如果我用m.id=mi.movie删除
,查询会得到太多的结果

请尝试这样做:

$result = $em->getRepository('CineupsWebAppBundle:MovieInterest')
    ->createQuery('mi')
    ->innerJoin('mi.Movie', 'm')
    ->andWhere('m.id = :id')
    ->andWhere('mi.user = :user')
    ->getQuery()
    ->setParameter(':id', $id)
    ->setParameter(':user', $user->getId())
    ->getResult();
这也将解决原始查询中的
sqj注入
漏洞

您需要向实体添加映射信息:

/**
 * @ORM\ManyToOne(targetEntity="Movie", inversedBy="movieInterests")
 * @ORM\JoinColumn(name="id", referencedColumnName="movie")
 */
private $movie;

我发现了问题:我与表联接,而不是与关系联接。下面是正确的代码:

"SELECT mi FROM CineupsWebAppBundle:MovieInterest mi
 JOIN mi.movie m
 WHERE m.id=".$id." AND mi.user=".$user->getId())

有点离题-您的查询是
sql injection
vulnerableThx,我想暂时保留dql,因为它是一个原型,我还有另一个查询,我现在不想更改。我添加了JoinColumn注释“@ORM\JoinColumn(name=“movie\u id”,referencedColumnName=“id”)”,但没有任何区别,因为它是可选的。也许这是使用DQL时的预期行为?稍后我将切换到查询生成器,并尝试您也可以尝试在您的查询中将
WITH
更改为
ON
——只是瞎猜我昨天尝试过,我确认它不起作用。我只是希望on条件会从我的关系映射中自动设置。我会让代码保持原样,然后再找出解决方案——见我的答案。你的代码已经正确了