我想如果我不想在条件上覆盖关系,我只需使用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
,则查询结果太多
答案 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())