Symfony - 带连接的查询生成器

Symfony - Query Builder with Join

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

我有两个实体,一个叫用户,一个叫棚。 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 时,棚子不显示。如果 shed 已发布但用户处于非活动状态,则 shed 也会显示,但不应该显示。 任何人都可以帮我吗?

active 属性的正确注释应该是:

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

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

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

编辑(正确答案):

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