2017-06-06 25 views
1

我們創造之間的簡單毫米關係的模型,像這樣:獲取TYPO3 Extbase毫米關係算

<?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數據庫創建一個新毫米表,並創建在..domain_post表計數器列users。是否有一個「更輕」的方式來獲得這個計數,而不是打電話給所有相關的用戶並計算它們?

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

想象一下,每個帖子都有30000個喜歡的帖子。該腳本開始在內存中建立30000個對象。問帖子表中的數字聽起來對我來說更爲現實。但如何?

回答

2

Extbase存儲庫默認情況下得到countAll()/ countByProperty()。您還可以將自己的函數添加到存儲庫中,以便返回任何查詢的對象數。

你可以嘗試這樣的事情在你的控制器:

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

這要求你的用戶模型得到的東西就像一個反向引用屬性(如「likedPosts」),以已經喜歡由用戶發表的所有帖子。

編輯: 用戶的favoritePosts屬性也必須是Objectstorage。因此,默認的countByXy函數可能不起作用,因爲Objectstorages需要包含() - 存儲庫中的約束。所以,你可能有自己的功能添加到usersRespository - 是這樣的:

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

如果算上執行的語句,extbase仍將構建每一個匹配實體extbase對象。但是,如果您不先執行查詢就調用count,如文檔中所述https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html 。 – j4k3

+2

@ j4k3感謝這個重要的建議j4k3 - 我編輯了上面的答案。 –

1

如果您關注的是在這裏的表現,你可能要考慮重新定義你們的關係模型。 TYPO3在自動維護相關實體數量的實體中保留MM關係的關係字段。然後你可以編寫一個自定義查詢來解析實際的列內容,這將是喜歡的數量。 Heres博客文章是一個很好的起點,說明如何做到這一點。

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

您還需要了解延遲加載的關係,如,通過當前的模型來看,相對於用戶來說是不懶,這意味着Extbase將實例化所有這些用戶爲每一個崗位加載。

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