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;
}
有没有办法用一个查询获取所有翻译的对象?
嘿,我有同样的问题,你有没有找到解决办法呢?谢谢。 –
凹凸。在使用querybuilder时遇到同样的问题 – NDM