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')
我有点困惑,为什么这不起作用。
我有两个实体,一个叫用户,一个叫棚。 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')