Doctrine - 基于查询的自定义表单字段

时间:2014-07-18 12:27:31

标签: php symfony doctrine-orm doctrine

我有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

1 个答案:

答案 0 :(得分:1)

Doctrine不提供允许您为实体属性(Annotation reference)指定查询的注释。您可以创建custom method in your repository来实施检查。你有没有衡量这种关系的成本?正确的关系和索引这应该是一个无问题,因为学说懒惰加载关系? Check the doctrine documentation about extra lazy collections