Doctrine DQL不会自动设置ON JOIN

时间:2014-11-06 18:41:55

标签: symfony doctrine dql

我想如果我不想在条件上覆盖关系,我只需使用WITH来添加其他条件。我不确定我的映射是否错误,但在WITH中没有连接条件的DQL会产生CROSS加入
在这里我的实体关系(Symfony):

电影:

/**
 * @ORM\OneToMany(targetEntity="MovieInterest", mappedBy="movie")
 */
private $movieInterests;

MovieInterest:

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

这是我在MovieInterestRepository中的查询:

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();
}

如果我删除WITH m.id=mi.movie,则查询结果太多

2 个答案:

答案 0 :(得分:1)

尝试这样做:

$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-injection漏洞

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

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

答案 1 :(得分:0)

我发现了问题:我加入了桌子而不是关系。这里有正确的代码:

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