【发布时间】:2014-07-18 12:27:31
【问题描述】:
我有 2 个链接实体:用户和访问权限。我希望我的原则用户实体有一个字段来通知我用户是否有访问权限。 我不能在两个表之间建立一个简单的 OneToMany 关系,因为有成千上万的访问,而且一旦我只需要知道是否有任何记录,从数据库中获取数千条记录的成本就太高了。 我想要的是一个链接到本机查询的字段,例如:
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()->isEmpty() 选择了整个集合
user-getAccesses()->count() 在数据库中使用了count(*),需要243ms才能返回
为了比较我上面的查询谁做了我想要的平均需要 12 毫秒,窥视时间为 2 毫秒甚至 1 毫秒。
也许学说方面的好人可以在 isEmpty 上为额外的惰性查询实现这个?
感谢@Otanaught
【问题讨论】:
标签: php symfony doctrine-orm doctrine