【问题标题】:Get TYPO3 Extbase mm relation count获取 TYPO3 Extbase mm 关系计数
【发布时间】:2017-06-06 15:03:34
【问题描述】:

我们在模型之间创建了一个简单的 mm 关系,如下所示:

<?php
namespace VENDOR\COMPANY\Domain\Model;

class Posts extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{

//..

 /**
   * users
   *
   * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VENDOR\COMPANY\Domain\Model\Users>
   */
   protected $likedBy = null;

 //..

}

MySQL 数据库创建一个新的 mm 表,并在 ..domain_post 表中创建一个计数器列 users。有没有比调用所有相关用户并计算他们的“更轻松”的方法来获得此计数?

$amountLikes = $post->getLikedBy()->count();

想象一个帖子列表,每个帖子都有 ~ 30000 个赞。该脚本开始在内存中构建 30000 个对象。向帖子表询问数字对我来说听起来更现实。但是怎么做呢?

【问题讨论】:

    标签: php mysql typo3 extbase


    【解决方案1】:

    Extbase 存储库默认获取 countAll() / countByProperty()。您还可以将自己的函数添加到存储库中,以仅返回任何查询的对象计数。

    你可以在你的控制器中尝试这样的事情:

    $amountLikes = $this->usersRepository->countByLikedPosts($anyPost);
    

    这要求您的用户模型获得用户喜欢的所有帖子的反向引用属性(如“likedPosts”)。

    编辑: 用户的 likePosts 属性也必须是 Objectstorage。因此,默认的 countByXy 函数可能不起作用,因为 Objectstorages 需要存储库中的 contains()-约束。因此,您可能必须将自己的函数添加到 usersRespository - 如下所示:

    public function countByLikedPost($post) {
        $query = $this->createQuery();
        return $query->matching($query->contains('likedPosts',$post))->count();
    }
    

    【讨论】:

    • 如果计算执行的语句,extbase 仍然会为每个匹配的实体构造一个 extbase 对象。但是,当您在不先执行查询的情况下调用 count 时,情况并非如此,如文档 docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/… 中所述。
    • @j4k3 感谢 j4k3 这个重要的建议 - 我编辑了上面的答案。
    【解决方案2】:

    如果您关心的是性能,您可能需要考虑重新定义您的关系模型。 TYPO3 在自动维护相关实体数量的实体中保留 MM 关系的关系字段。然后,您可以编写一个自定义查询来解析实际的列内容,这将是喜欢的数量。这是一篇博文,可以作为一个很好的起点来了解如何做到这一点。

    http://lbrmedia.net/codebase/Eintrag/extbase-bidirektionale-mm-relation/

    您还需要了解延迟加载关系,因为根据您当前的模型判断,与用户的关系不是延迟加载的,这意味着 Extbase 将为您加载的每个帖子实例化所有这些用户。

    https://docs.typo3.org/typo3cms/ExtbaseFluidBook/5-Domain/2-implementing-the-domain-model.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多