Symfony - 带有Join的查询生成器

时间:2016-04-10 10:51:35

标签: symfony doctrine-orm query-builder

我有点困惑,为什么这不起作用。

我有两个实体,一个叫做user的实体和一个叫做shed的实体。 1个用户可以有多个棚子,1个棚子可以属于1个用户。

他们与ManyToOne

连接
class User
{

 /**
 * @var boolean
 *
 * @ORM\Column(columnDefinition="TINYINT(1) NOT NULL")
 */
protected $active = true;


 /**
  * @ORM\OneToMany(targetEntity="AppBundle\Entity\Shed", mappedBy="user")
  */
  protected $shed;
}

class Shed
{
     /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="shed")
 * @ORM\JoinColumn(name="user", referencedColumnName="id", onDelete="CASCADE")
 *
 * @var User
 */
protected $user;

/**
 * @var boolean
 *
 * @ORM\Column(columnDefinition="TINYINT(1) NOT NULL")
 */
protected $published = false;
}

我想要实现的是,我查询已发布的活跃用户的最新3个棚。

在我的ShedRepository中,我有以下方法:

class ShedRepository
{
    public function getNewestSheds()
    {
        $query = $this->createQueryBuilder('s')
            ->join('AppBundle:User', 'u')
            ->andWhere('u.active = 1')
            ->andWhere('s.published = 1')
            ->orderBy('s.createdAt', 'DESC')
            ->setMaxResults(3)
            ->getQuery();

        return $query->getResult();
      }
}

当shed.published属性为0时,没有显示棚屋。如果棚子已经发布但是用户处于非活动状态,那么也会显示棚屋,但不应该。 任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

active属性的正确注释应为:

 /**
 * @var boolean
 *
 * @ORM\Column(name="active", type="boolean", columnDefinition="TINYINT(1) NOT NULL")
 */

(您忘记指定列的名称和类型,这使得属性未映射,因此它始终为真)

与Shed实体的已发布属性类比。

编辑(正确答案):

你有错误的join()调用。您需要使用:->join('s.user', 'u')