2011-08-10 29 views
1

還有HotelCommentCommentPhoto(1:n) - 用戶可以添加一些照片到自己的評論。我用一個查詢加載評論片段,並希望使用其他查詢將照片加載到此評論(使用WHERE IN)。Doctrine2:主要加載後填寫相關實體

$comments = $commentsRepo->findByHotel($hotel); 
$comments->loadPhotos(); // of course comments is simple array yet 

根據需要加載評論,而不是在PostLoad事件。

所以問題是:如何將加載的評論與HotelComment的對象相關聯?使用ReflectionPropertysetAcesseble() + setValue()?有更簡單的溶劑嗎?我恐怕UoW檢測到HotelComment實體被修改,並將更新發送到數據庫。

+0

不知道我明白這個問題。爲什麼不直接通過findByHotel()中的連接加載CommentPhoto實體? – timdev

+0

您在這裏處理的是什麼類型的環境,只是向最終用戶展示酒店以及評論和照片? – timdev

+0

我不想加入照片,因爲除了'CommentPhoto''介紹'CommentVotes'(用戶可以通過一些參數評價酒店)和其他東西。太多的表加入。 +正如我所說,我們不需要這張照片 - 它應該按需加載。 – Koc

回答

0

您必須將您的關係配置爲「LAZY」。見教義文檔:

  1. ManyToOne
  2. ManyToMany
  3. OneToOne

比你能夠與$comments->loadPhotos()懶洋洋地加載它,至少文檔says so

UPDATE:我認爲你不需要特別的東西來避免你的實體衝到數據庫。實際上,當您使用DQL查詢條目時,它們具有managed狀態,因此將它們附加到其他託管實體的集合不會更改它們的狀態,因此只有修改它們纔會刷新它們。

Hovewer,不會在所有幫助,因爲協會是牽強以前第一次使用,因此增加一個實體與下面的代碼集合將導致一個隱含的數據庫查詢:

$comment->addPhoto($photo); 
//in Comment class 
function addPhoto(Photo $photo){ 
    //var_dump(count($this->photos)); //if you have any - they are already here 
    $this->photos->add($photo); 
} 

也許把你的收藏集公開(或者用ReflectionProperty這個招數)會有助於愚弄這個教義,但這是一個骯髒的黑客攻擊,所以我甚至沒有嘗試過它們。

分離父實體也沒有幫助。我已經跑出去的,現在的想法....

+0

在此之後,我將獲得+ N個查詢。我想要使​​用一個查詢'WHERE IN'。 – Koc

+1

所以你想用單個查詢加載你的對象,並將它附加到託管對象上。而且你不希望這些對象在同步時再次刷新到數據庫,對吧? – J0HN

+0

是的,你完全正確。 – Koc

0

如果你只想滋潤相關對象這一次,而不是每一個對象被加載時,你需要使用DQL:

$em->createQuery("SELECT comments, photos FROM HotelComment comments JOIN comments.photos photos"); 

你可以把它放在版本庫的一個方法中。 這將發出一個SELECT語句,INNER JOIN添加到評論照片表。

+0

問題沒有在這。 – Koc