- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了以下问题:我想在不破坏我的 Symfony 应用程序的默认行为的情况下获取特定语言环境的 Doctrine 实体。
这是我的实体之一的示例:
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="ProductRepository")
* @ORM\Table(name="product")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
*/
class Product
{
/**
* @var integer $id
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string")
* @Gedmo\Translatable
*/
protected $name;
// ...
}
相关 Doctrine 库的一部分:
class ProductRepository extends \Doctrine\ORM\EntityRepository
{
public function findOneProductInLocale($id, $locale)
{
$qb = $this->createQueryBuilder('p')
->select('p')
->where('p.id = :id')
->setMaxResults(1)
->setParameter('id', $id);
;
$query = $qb->getQuery();
$query->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);
// force Gedmo Translatable to not use current locale
$query->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
$locale
);
$query->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK,
1
);
return $query->getOneOrNullResult();
}
}
和我的部分脚本:
// default Locale: en
// request Locale: de
$repo = $em->getRepository('Acme\\Entity\\Product');
$product1 = $repo->findOneById($id);
echo $product1->getName(); // return 'Name (DE)'
$product_de = $repo->findOneProductInLocale($id, 'de');
echo $product_de->getName(); // return 'Name (DE)';
$product_en = $repo->findOneProductInLocale($id, 'en');
echo $product_en->getName(); // return 'Name (EN)'
echo $product1->getName(); // return 'Name (EN)' instead of 'Name (DE)' !! <-- What is wrong?
// even if I refetch a product
$product2 = $repo->findOneById($id);
echo $product2->getName(); // return 'Name (EN)' without taking anymore in account the current locale
现在有人知道为什么这没有按预期工作吗?我的 ProductRepository::findOneProductInLocale()
实现有问题吗?
欢迎任何帮助或提示。
最佳答案
我知道我的回答有点晚了,但我遇到了同样的问题并找到了解决方案。我希望它能帮助其他一些开发人员。
您的 findOneProductInLocale
如果完全正常。
它作为设计工作 - 当您将使用 findOneProductInLocale
时,查询将在给定的语言环境中搜索,但最终实体将始终在当前语言环境中加载,您无法更改它。
通过 findOneProductInLocale
找到实体并加载到当前语言环境后,您可以获得所需的语言环境变体通过使用 Gedmo 的 setTranslatableLocale
方法并按照 @umadesign 的说明刷新您的实体
// Reload the entity in different languages.
$entity->setTranslatableLocale($locale);
$em->refresh($entity);
(可选)您可能需要将 setTranslatableLocale
方法和伴随属性 $local
添加到您的可翻译实体
class Product {
// ...
/**
* @Gedmo\Locale
* Used locale to override Translation listener`s locale
* this is not a mapped field of entity metadata, just a simple property
*/
private $locale;
/**
* Set the locale to use for translation listener
*
* @param string $locale
*
* @return static
*/
public function setTranslatableLocale($locale) {
$this->locale = $locale;
return $this;
}
// ...
}
您可以在 Gedmo documentation under "Basic usage examples" subsection 中找到完整的解释.
关于php - 如何使用 Doctrine 和 Gedmo Translatable Extension 获取不同翻译的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28027356/
我已经在我的实体上进行日志记录,以便当我使用 @Gedmo\Versioned 更改产品字段时注释创建了一个新版本。然而唯一的问题是username场遗迹NULL .有一个经过身份验证的用户,因为更新
我将 Symfony2.2 与 StofDoctrineExtensionsBundle(以及 Gedmo DoctrineExtensions)一起使用。 我有一个简单的实体 /** * @ORM
我决定在 Symfony 上安装 "gedmo/doctrine-extensions" 以使用 Translatable。 它工作正常,只是监听器忽略了我指定的默认语言环境,总是回落到 en_US。
我有一个使用 gedmo doctrine 可翻译扩展的实体。我能够在当前语言环境中加载该实体。 现在,对于我希望用户查看和编辑各种翻译的管理面板,我想显示所有翻译或用户选择的特定翻译。 我只有那个实
有没有人找到解决这个问题的方法?我遇到了同样的问题。 我的config.yml: # Doctrine Configuration doctrine: dbal: driver
我有两个实体。像这样的模式: /* * @ORM\MappedSuperClass * @JMS\ExclusionPolicy("all") */ abstract class BaseEn
我正在使用带有 doctrine2 的 gedmo 扩展来应用软删除和时间戳行为(默认情况下它们在 doctrine1 中,但对于 doctrine2 它是扩展),它总是很难删除记录。它应该只在“de
我正在尝试使用 sonata admin + a2lix + gedmo translatable 来翻译我的实体。 不幸的是它不起作用,因为我希望在表单中看到我的可翻译字段,而在我的后端我可以看到这
我正在尝试将默认分隔符更改为“+” /** * @var string $slug * @Gedmo\Slug(fields={"label"}, separator="+") * @ORM\C
我正在尝试翻译实体的某些字段,但在尝试创建对象时出现以下错误... id; } /** * Set name * * @param string $nam
我刚刚安装了使用 Sluggable 的学说扩展。 我做这个: Composer .json "stof/doctrine-extensions-bundle": "1.2.*@dev" 应用内核.p
我有一棵树已经存在,我需要更改某些节点的父节点。假设我有以下树: /Food /Vegetables /Onions /Carrots /Cab
我正在尝试使用 softdelete gedmo/doctrine-extensions 的选项但出于某种原因,当我调用 romove() 时,数据库中的记录被删除而不是更新 deletedAt fi
我有一个 Symfony 2.8 应用程序,它使用 Gedmo\Timestampable 注释进行自动 created_at 和 updated_at 操作,但它似乎首次创建实体/行时,将相同的时间
我在我的 Symfony2 项目中有一个一对一的关系,其中一个 Question 引用了一个 Video - 两者都有一个 created 和 更新 Gedmo\Timestampable 行为,基本
使用 https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#advanced-examples 上
我正在尝试使用 gedmo 学说扩展来翻译实体。 https://github.com/Atlantic18/DoctrineExtensions 我使用 yml 作为 orm 映射文件(自动生成实体
我在使用 Symfony2 命令和使用 Doctrine2 运行批处理脚本时遇到内存泄漏问题 this guide .我坚持并以 50 为一组刷新并在之后调用 $em->clear(),但是当我测量
我遇到了以下问题:我想在不破坏我的 Symfony 应用程序的默认行为的情况下获取特定语言环境的 Doctrine 实体。 这是我的实体之一的示例: use Doctrine\ORM\Mapping
在我的 Symfony 2.7 项目中,我使用 StofDoctrineExtension‐Bundle .我已经宣布了一些实体。他们使用 Timestampable、Loggable 和 Slugg
我是一名优秀的程序员,十分优秀!