我有这两个实体。
消息实体
class Message
{
/**
* @ManyToOne(targetEntity="User")
* @JoinColumn(name="author", referencedColumnName="id_user")
*/
protected $author;
用户实体
class User
{
/**
* @Id
* @Column(type="integer", nullable=false, name="id_user")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Column(type="string", nullable=false)
*/
protected $name;
我需要得到用户的所有留言及其数据,以便于 回响 类似这样的东西。
echo $user->getName() . " have {$user->totalOfMessage()}";
我现在可以在User实体中建立一个关系来获取一个消息集合。但我不知道是否有必要只获取大小。
好吧,我找到了答案。至少有一个不错的选择。
从Doctrine 2.1开始,你可以将关联标记为额外的懒惰。这意味着调用$user->getMessages()->count()不会加载消息,它只是向数据库发出一个COUNT查询。
你可以在这里阅读关于额外的懒惰集合。https:/www.doctrine-project.orgprojectsdoctrine-ormen2.7tutorialsextra-lazy-associations.html
我最近一直在尝试让EXTRA_LAZY加载工作,并发现了一个我认为是相当大的错误的文档,如页面所示:-。
http:/www.doctrine-project.orgdocsorm2.1entutorialsextra-lazy-associations.html
我希望大多数Doctrine用户都能意识到fetch="EXTRA_LAZY "需要放在ManyToMany关系的 "拥有 "侧,但这个例子显示注释被添加到包含 "mappedBy "的行中,而这个行不是拥有侧。
通过在非拥有方添加fetch="EXTRA_LAZY "指令,我现在知道它应该被完全忽略。我认为应该在文档中更清楚地说明这一点。
我找不到任何地方有文章解释这个问题,所以我想说这可能值得修改文档。
在我们的使用案例中,它使一个使用了大量 "包含 "调用的特别密集的处理块,由于超过内存限制而不断崩溃,变成了一个快速处理,现在执行速度快了好几个数量级。
希望这些信息能帮助到大家......