Symfony DQL原则不';t设置为自动连接
我想如果我不想覆盖关系的on条件,我只需要使用WITH来添加一个附加条件。我不确定我的映射是否错误,但是在WITH中没有join条件的DQL会进行交叉连接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"
这里是我的实体关系(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条件会从我的关系映射中自动设置。我会让代码保持原样,然后再找出解决方案——见我的答案。你的代码已经正确了