我試圖從我的教義表包括其翻譯(我使用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。
您是否曾經能夠找到多查詢問題的解決方案?我也有這個問題,翻譯的作品,但在一些頁面中,我有多達100個生成的學說查詢! –
最後我去了一個自定義的解決方案。對於我需要翻譯值的每個表,我有另一個名稱以「本地化」結尾的表(例如「Country」和「CountryLocalized」)。第一個表具有主ID和不需要翻譯的值(像整數,外鍵等)。它與第二個連接有一對多的連接。第二個具有唯一的區域設置列,並且每個區域設置包含一行,第一個表中的單個行的已翻譯值。當我拉動記錄時,我使用主鍵和區域設置在兩列之間進行連接。 –