symfony中的多个连接:错误:预期=,<,< =,<>,>,> =,!=

时间:2015-08-10 15:59:25

标签: php mysql symfony join doctrine

我正在尝试创建和操作,返回给定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的数量,它确实有效。它看起来像语法错误,但我无法从我收集的示例中找到它。

这是执行此查询的正确方法吗?

2 个答案:

答案 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,但如果您有任何评论,他们将非常受欢迎。