2014-05-14 76 views
1

Im在我的项目中使用Gedmo Translatable。 我有产品实体和包含实体。 他们之间的关系是ManyToMany。内部化Symfony,Gedmo可翻译,mising翻译为相关实体

产品实体

namespace Traffic\ShopBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Traffic\ShopBundle\Model\Product as ProductModel; 
use Gedmo\Mapping\Annotation as Gedmo; 


/** 
* @ORM\Entity(repositoryClass="Traffic\ShopBundle\Repository\ProductRepository") 
* @Gedmo\TranslationEntity(class="Traffic\ShopBundle\Entity\ProductTranslation") 
* 
*/ 
class Product extends ProductModel { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Gedmo\Translatable 
    * 
    * @var type string 
    */ 
    protected $name; 

    /** 
    * @ORM\ManyToMany(targetEntity="Inclusion") 
    * @ORM\JoinTable(name="product_inclusion", 
    *  joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="inclusion_id", referencedColumnName="id")} 
    *) 
    * 
    * @var type Collection 
    */ 
    protected $inclusions; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="ProductTranslation", 
    * mappedBy="object", 
    * cascade={"persist", "remove"} 
    *) 
    */ 
    protected $translations; 

..... 
} 

纳入实体

namespace Traffic\ShopBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Traffic\ShopBundle\Model\Inclusion as InclusionModel; 
use Gedmo\Mapping\Annotation as Gedmo; 


/** 
* @ORM\Entity(repositoryClass="Traffic\AdminBundle\Repository\TranslatableRepository") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"sauce" = "Sauce", "topping" = "Topping"}) 
* @Gedmo\SoftDeleteable(fieldName="deletedAt") 
* @Gedmo\TranslationEntity(class="Traffic\ShopBundle\Entity\InclusionTranslation") 
* 
* @ORM\Table(name="inclusion") 
*/ 
class Inclusion extends InclusionModel { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Gedmo\Translatable 
    * 
    * @var type string 
    */ 
    protected $name; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="InclusionTranslation", 
    * mappedBy="object", 
    * cascade={"persist", "remove"} 
    *) 
    */ 
    protected $translations; 
....... 
} 

在我的仓库类我有一个方法来获取翻译的对象,但它只是将我的产品不夹杂

namespace Traffic\ShopBundle\Repository; 

use Traffic\AdminBundle\Repository\TranslatableRepository; 
use Traffic\ShopBundle\Entity\Kiosk; 

/** 
* Description of FinancialTransactionRepository 
* 
* @author bart 
*/ 
class ProductRepository extends TranslatableRepository { 


    public function findAllProductsForKiosk(Kiosk $kiosk, $locale = "es"){ 

     $qb = $this->createQueryBuilder("p") 
      ->leftJoin('p.kiosks', 'k') 
      ->leftJoin('p.flavours', 'f') 
      ->leftJoin('p.inclusions', "i") 
      ->leftJoin('p.type', "t") 

      ->where('k.kiosk = :kiosk') 
     ; 

     $qb->setParameter("kiosk", $kiosk); 

     $results = $this->getTranslatedQuery($qb, $locale); 

     return $results->execute(); 
    } 


} 

和getTranslatedQuery

/** 
* Returns translated Doctrine query instance 
* 
* @param QueryBuilder $qb  A Doctrine query builder instance 
* @param string  $locale A locale name 
* 
* @return Query 
*/ 
protected function getTranslatedQuery(QueryBuilder $qb, $locale = null) 
{ 
    $locale = null === $locale ? $this->defaultLocale : $locale; 

    $query = $qb->getQuery(); 

    $query->setHint(
     Query::HINT_CUSTOM_OUTPUT_WALKER, 
     'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker' 
    ); 

    $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); 

    return $query; 
} 

有没有办法用一个查询获取所有翻译的对象?

+0

嘿,我有同样的问题,你有没有找到解决办法呢?谢谢。 –

+0

凹凸。在使用querybuilder时遇到同样的问题 – NDM

回答

-1

也许你应该改变水合模式?

$query->setHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION); 
    $config = $this->container->get('doctrine')->getManager()->getConfiguration(); 
    if ($config->getCustomHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION) === null) { 
     $config->addCustomHydrationMode(
      TranslationWalker::HYDRATE_OBJECT_TRANSLATION, 
      'Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator' 
     ); 
    }