【问题标题】:Join 3 tables in Symfony2在 Symfony2 中加入 3 个表
【发布时间】:2014-10-08 10:16:54
【问题描述】:

我对 Symfony2 中的一些查询有疑问,我有 3 个实体(它们被简化了一点):

class Group
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;

    /** @ORM\OneToMany(targetEntity="GroupMember", mappedBy="family") */
    protected $groupMembers;


class GroupMember
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="group_member_type", type="integer")
     */
    protected $groupMemberType;

    /**
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="groupMembers")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
     */
    protected $group;

/**
 * @ORM\ManyToOne(targetEntity="Test\UserBundle\Entity\User", inversedBy="memberships")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
 */
protected $user;

USER -> 标准 FOSuserbundle 用户

我想查询返回当前用户是组成员的所有组。谁能告诉我该怎么做?

这是我的尝试:

SELECT g FROM (group g INNER JOIN groupmember gm ON g.id=gm.group_id) INNER JOIN fos_user u ON gm.user_id = u.id WHERE u.id = 6

但它会返回

Unknown column 'g' in 'field list'

【问题讨论】:

  • 您能否准确说明您的实体之间的关系?
  • 我已经更新了我的问题
  • 有什么理由不使用 Doctrine 的查询生成器?
  • 不,查询生成器和 createQuery 对我来说没有区别,但问题是我无法在 sql 和查询生成器中编写正确的查询

标签: sql symfony doctrine-orm


【解决方案1】:

使用查询生成器,假设您已获取用户并将其存储在 $userObject 中,并且您的包名称为 BundleName

$groups = $this->getDoctrine()->getManager()->createQueryBuilder()
    ->select('g')
    ->from('BundleName:Group', 'g')
    ->innerJoin('g.groupMembers', 'gm')
    ->innerJoin('gm.user', 'u')
    ->where('u = :user')
    ->setParameter('user', $userObject)
    ->getQuery()
    ->getResult();

您还需要确保您的关系映射是正确的。

/** @ORM\OneToMany(targetEntity="GroupMember", mappedBy="family") */
protected $groupMembers;

应该是

/** @ORM\OneToMany(targetEntity="GroupMember", mappedBy="group") */
protected $groupMembers;

【讨论】:

    【解决方案2】:

    这是正确的查询:

    SELECT g.* FROM (group g INNER JOIN groupmember gm ON g.id=gm.group_id) INNER JOIN fos_user u ON gm.user_id = u.id WHERE u.id = 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2015-10-10
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多