我有2个链接的实体:User和Acess。我希望我的doctrine用户实体有一个字段,告诉我用户是否有acesses。 我不能在两个表之间做一个简单的OneToMany关系,因为有数千个acesses,一旦我只需要知道是否有任何记录,从数据库中获取数千条记录的成本太高。 我想要的是链接到本机查询的字段,如:
select * from accesses where user = <whatever> limit 1
更具体地说,例如:
/**
* USer
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User {
/**
* @ORM\Column(name="user_id", type="bigint", nullable=false)
* @ORM\Id
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=300, nullable=false)
* @Assert\NotBlank()
*/
private $name;
/**
* @ORM\Query="select exists (select id_acesses from accesses where user = "$id" limit 1)"
*/
private $hasAcesses;
}
这可能吗?还有另外一种方法吗?
修改:
根据下面的@Otanaught答案,我做了一些测试:
使用与EXTRA_LAZY获取的OneToMany关系:
user-getAccesses() - &gt; isEmpty()选择了整个集合
user-getAccesses() - &gt; count()在数据库中使用了count(*),需要243ms才能返回
为了比较,我上面的查询做了我想做的事,平均花了12毫秒,偷看2毫秒甚至1毫秒。
也许理论上的优秀人员可以在isEmpty中实现这个额外的懒惰查询?
Thanx @Otanaught
答案 0 :(得分:1)
Doctrine不提供允许您为实体属性(Annotation reference)指定查询的注释。您可以创建custom method in your repository来实施检查。你有没有衡量这种关系的成本?正确的关系和索引这应该是一个无问题,因为学说懒惰加载关系? Check the doctrine documentation about extra lazy collections