我正在尝试创建和操作,返回给定PrivateUser的所有Variantset。这是一个多对多的关系,所以中间有一个连接表。
这是我正在尝试运行的查询
$variants = $repository->createQuery('SELECT variants
FROM AppBundle:PrivUser user
JOIN AppBundle:PrivUserVariantset uv
JOIN AppBundle:Variantset variants
WHERE user.iduser=:user_id')
->setParameter('user_id', $userid)
->getResult();
但它返回:
[Syntax Error] line 0, col 146: Error: Expected =, <, <=, <>, >, >=, !=, got 'variants'
如果我使用单个连接尝试相同的查询,例如从PrivUserVariantset表获取Variantsets的数量,它确实有效。它看起来像语法错误,但我无法从我收集的示例中找到它。
这是执行此查询的正确方法吗?
答案 0 :(得分:1)
我认为更好的方法是:
$variantsRepository = $this->getDoctrine()->getRepository('AppBundle:Variantset');
$qb = $variantsRepository->createQueryBuilder('variants'); //'variants' is just alias, it can be whatever you want
$qb->join('variants.privUsers', 'user')
->where('user.id = :user_id')->setParameter('user_id', $userid)
->getQuery()
->getResult();
修改强>:
/** @Entity **/
class Variantset
{
// ...
/**
* @ORM\ManyToMany(targetEntity="PrivUser")
* @ORM\JoinTable(name="Variantset_privUser",
* joinColumns={@ORM\JoinColumn(name="iduser", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="idvariantset", referencedColumnName="id")}
* )
**/
private $privUsers;
// ...
public function __construct() {
$this->privUsers = new \Doctrine\Common\Collections\ArrayCollection();
}
}
答案 1 :(得分:1)
最后,我通过更改JoinTable注释中详述的列来实现它:variantid应该在第一个joinColumns上,而priv_userid必须在inverseJoin上继续
Variantset类:
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="PrivUser")
* @ORM\JoinTable(name="priv_user_variantset",
* joinColumns={@ORM\JoinColumn(name="variantset_varid", referencedColumnName="varid")},
* inverseJoinColumns={@ORM\JoinColumn(name="priv_user_priv_userid", referencedColumnName="priv_userid")}
* )
**/
private $privusers;
// ...
public function __construct() {
$this->privUsers = new \Doctrine\Common\Collections\ArrayCollection();
}
控制器:
$variantsRepository = $this->getDoctrine()->getRepository('AppBundle:Variantset');
$em = $variantsRepository->createQueryBuilder('variants'); //'variants' is just alias, it can be whatever you want
$variants = $em->join('variants.privusers', 'user')
->where('user.privUserid = :user_id')->setParameter('user_id', $userid)
->getQuery()->getResult();
我只有两个实体,Varianset和PrivUser,而DB有三个表,每个实体一个加上priv_user_variantset,它通过ManyToMany关系连接。
它现在可用于我的API,但如果您有任何评论,他们将非常受欢迎。