【问题标题】:Doctrine - Custom form field based on queryDoctrine - 基于查询的自定义表单字段
【发布时间】: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


    【解决方案1】:

    Doctrine 不提供允许您指定查询实体属性的注释 (Annotation reference)。您可以创建一个custom method in your repository 来实施检查。你衡量过这种关系的代价有多大吗?有了正确的关系和索引,这应该不是问题,因为教义延迟加载关系? Check the doctrine documentation about extra lazy collections.

    【讨论】:

    • 其实,阅读这个文档,超懒的联想有我所需要的。如果我可以在不触发负载的情况下访问 Collection 的 isEmpty 方法,那就更好了。你知道它是否可用吗?
    • 实际上在额外的惰性集合上调用 count 不会加载完整的集合。关于额外惰性集合的文档说明了这一点。
    • 我已阅读。但是,当处理大型结果集时,即使是计数也可能是不变的。这就是为什么我想改用 isEmpty 的原因。但我正在测试。 BRB 在几分钟内得到结果。
    • 你想如何在不询问的情况下检查是否有东西? :) 即使没有 ORM,这也是不可能的。
    • 好吧,因为它取决于 count() 实现。 Se 上面我作为示例给出的查询?根据我的需要,它比任何计数估计的成本都要低得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多