Prechádzať zdrojové kódy

[docs] updated translatable ducumentation on usage of query hints with cache

gedi 13 rokov pred
rodič
commit
f9308f9589
1 zmenil súbory, kde vykonal 44 pridanie a 18 odobranie
  1. 44 18
      doc/translatable.md

+ 44 - 18
doc/translatable.md

@@ -4,7 +4,7 @@
 in diferent languages. Further more, it loads the translations automatically for a locale
 in diferent languages. Further more, it loads the translations automatically for a locale
 currently used, which can be set to **Translatable Listener** on it`s initialization or later
 currently used, which can be set to **Translatable Listener** on it`s initialization or later
 for other cases through the **Entity** itself
 for other cases through the **Entity** itself
-    
+
 Features:
 Features:
 
 
 - Automatic storage of translations in database
 - Automatic storage of translations in database
@@ -431,15 +431,15 @@ $em->flush();
 ## Using ORM query hint
 ## Using ORM query hint
 
 
 By default, behind the scenes, when you load a record - translatable hooks into **postLoad**
 By default, behind the scenes, when you load a record - translatable hooks into **postLoad**
-event and issues additional query to translate all fields. Imagine that when you load a collection,
-when it issues a lot of queries just to translate those fields. Also if you want to hydrate
-result as an **array**, it is not possible to hook any **postLoad** event since it is not an
-entity being hydrated. These are the main reason why **TranslationWalker** was born.
+event and issues additional query to translate all fields. Imagine that, when you load a collection,
+it may issue a lot of queries just to translate those fields. Including array hydration, 
+it is not possible to hook any **postLoad** event since it is not an
+entity being hydrated. These are the main reasons why **TranslationWalker** was created.
 
 
 **TranslationWalker** uses a query **hint** to hook into any **select type query**,
 **TranslationWalker** uses a query **hint** to hook into any **select type query**,
 and when you execute the query, no matter which hydration method you use, it automatically
 and when you execute the query, no matter which hydration method you use, it automatically
 joins the translations for all fields, so you could use ordering filtering or whatever you
 joins the translations for all fields, so you could use ordering filtering or whatever you
-want on **translations of the fields** instead of original record fields.
+want on **translated fields** instead of original record fields.
 
 
 And in result there is only one query for all this happyness.
 And in result there is only one query for all this happyness.
 
 
@@ -451,11 +451,14 @@ Now enough talking, here is an example:
 
 
 ``` php
 ``` php
 <?php
 <?php
-$dql = "SELECT a, c, u FROM Article a "
-     . "LEFT JOIN a.comments c "
-     . "JOIN c.author u "
-     . "WHERE a.title LIKE '%translated_title%' "
-     . "ORDER BY a.title";
+$dql = <<<___SQL
+  SELECT a, c, u
+  FROM Article a
+  LEFT JOIN a.comments c
+  JOIN c.author u
+  WHERE a.title LIKE '%translated_title%'
+  ORDER BY a.title
+___SQL;
 
 
 $query = $em->createQuery($dql);
 $query = $em->createQuery($dql);
 // set the translation query hint
 // set the translation query hint
@@ -472,13 +475,19 @@ And even a subselect:
 
 
 ``` php
 ``` php
 <?php
 <?php
-$subSelect = "SELECT a2.id FROM Article a2 "
-    . "WHERE a2.title LIKE '%something_translated%'";
-$dql = "SELECT a, c, u FROM Article a "
-    . "LEFT JOIN a.comments c "
-    . "JOIN c.author u "
-    . "WHERE a.id IN ({$subSelect}) "
-    . "ORDER BY a.title";
+$dql = <<<___SQL
+  SELECT a, c, u
+  FROM Article a
+  LEFT JOIN a.comments c
+  JOIN c.author u
+  WHERE a.id IN (
+    SELECT a2.id
+    FROM Article a2
+    WHERE a2.title LIKE '%something_translated%'
+      AND a2.status = 1
+  )
+  ORDER BY a.title
+___SQL;
 
 
 $query = $em->createQuery($dql);
 $query = $em->createQuery($dql);
 $query->setHint(
 $query->setHint(
@@ -486,6 +495,23 @@ $query->setHint(
     'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
     'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
 );
 );
 
 
+**NOTE:** if you use memcache or apc. You should set locale and other options like fallbacks
+to query through hints. Otherwise the query will be cached with a first used locale
+
+``` php
+<?php
+// locale
+$query->setHint(
+    \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
+    'en', // take locale from session or request etc.
+);
+// fallback
+$query->setHint(
+    \Gedmo\Translatable\TranslatableListener::HINT_FALLBACK,
+    1, // fallback to default values in case if record is not translated
+);
+```
+
 $articles = $query->getResult(); // object hydration
 $articles = $query->getResult(); // object hydration
 ```
 ```