2013-08-01 33 views
1

我試圖從我的教義表包括其翻譯(我使用Doctrine可翻譯)之一獲得所有記錄。原因是我想讓用戶在提交之前編輯所有數據。我有一些Google地圖標記有翻譯的說明。我想讓管理員在用javascript/jQuery構建的客戶端UI上編輯它們。我不想爲每個標記移動下載和更新數據,這就是爲什麼我決定採取這種方法。Symfony和Doctrine - 獲取所有實體,包括他們的翻譯使用可翻譯

現在我成功地發送了所有的數據(甚至翻譯的部分)到UI,但它需要相當多的查詢。首先,我從數據庫中提取所有默認數據,然後翻譯每條記錄。我知道,可怕的解決方案。我想重構這段代碼,以便每個請求需要一到兩個查詢。我的第一個想法是創建一個查詢,這將有翻譯的內部查詢。由於複雜性,我放棄了這個想法,我不想直接加載翻譯表。

下一個想法是關於使用兩個相同的查詢,但使用不同的翻譯提示。執行完這兩個查詢之後,我會創建一個模型對象,它可以容納所有需要的數據並從那裏繼續。這給我帶來了非常接近的解決方案,但我仍然有問題。一旦我設置提示來檢索翻譯,兩個查詢(翻譯的和原始的)都會返回翻譯結果。這裏是我的代碼到目前爲止:

$em = $this->getEntityManager(); 
$qb = $em->getRepository('SomeSite\SiteBundle\Entity\News') 
    ->createQueryBuilder('e') 
    ->select(); 

$q1 = $qb->getQuery(); 
$q2 = $qb->getQuery(); 

$q2->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); 
$q2->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'en'); 

$en = $q2->getResult(); 

$q1->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); 
$q1->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'hr'); 

$hr = $q1->getResult(); 
var_dump($hr); 
var_dump($en); 

這只是一段代碼進行測試(在新聞實體上完成)。這兩個轉儲產生相同的翻譯結果。這裏是很多環節我讀這導致我這點之一:

https://github.com/l3pp4rd/DoctrineExtensions/issues/771

,所以我想我的問題如下。誰能告訴我,這是否會被認爲是正確的做法?有沒有人有更好的主意來迅速解決這個問題?最後,最重要的是,有沒有人知道如何做到這一點?

謝謝你的見解和時間。

編輯: 我設法看看由nifr指向的包,但我有一些問題。我遵循this頁面的示例。

首先,當我嘗試更新模式時,它會引發一個錯誤,提示在第146行的GalleryTranslation.php中找不到「Class'Symfony \ Component \ Debug \ Exception \ ContextErrorException'。

如果我刷新頁面,它說「運行時通知:GalleryTranslation :: setObject()聲明應該與Gedmo \ Translatable \ Entity \ MappedSuperclass \ AbstractPersonalTranslation :: setObject($ object)兼容」,儘管我使用了Symfony代碼生成來生成它(生成實體)。

最後,代碼生成沒有將id對象設置爲id,所以有時候我得到一個錯誤,提示翻譯實體沒有設置id。

+0

您是否曾經能夠找到多查詢問題的解決方案?我也有這個問題,翻譯的作品,但在一些頁面中,我有多達100個生成的學說查詢! –

+0

最後我去了一個自定義的解決方案。對於我需要翻譯值的每個表,我有另一個名稱以「本地化」結尾的表(例如「Country」和「CountryLocalized」)。第一個表具有主ID和不需要翻譯的值(像整數,外鍵等)。它與第二個連接有一對多的連接。第二個具有唯一的區域設置列,並且每個區域設置包含一行,第一個表中的單個行的已翻譯值。當我拉動記錄時,我使用主鍵和區域設置在兩列之間進行連接。 –

回答

0

我建議你看看a2lix/TranslationFormBundle這正好解決了這種情況。

這是很容易設置和支持DoctrineExtensions KnpDoctrineBehaviors。

我一直在生產中多次使用它。

+0

你好!謝謝您的回答。我終於有時間看看你提到的那個包了。我在使用它時遇到了一些麻煩。我真的很感謝你看看我編輯過的帖子,看看你能否再次幫助我。非常感謝你! –