使用Lexik Translation Bundle时,如何获取无对应实体与仓库类的数据库表数据?
如何从Lexik Translation Bundle生成的无实体数据表中获取数据
嘿,完全可以用Doctrine来操作这些表!Lexik Translation Bundle确实不会自动生成对应的实体类,但我们有几种靠谱的方式来获取这些数据,我给你逐一拆解:
方法1:使用Lexik自带的管理服务(最推荐)
其实这个Bundle本身已经封装好了操作翻译数据的服务,不用自己折腾实体或者原生查询。你可以直接注入lexik_translation.translation_manager服务来操作数据。
比如在控制器里使用:
use Lexik\Bundle\TranslationBundle\Manager\TranslationManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class YourController extends AbstractController { public function getTranslations(TranslationManagerInterface $translationManager) { // 获取所有翻译条目 $translations = $translationManager->getTranslations(); // 或者按条件筛选,比如某个domain、某个locale $filteredTranslations = $translationManager->getTranslationsByDomainAndLocale('messages', 'en'); // 对数据做你需要的处理 return $this->json($translations); } }
这个方式最省心,因为是Bundle官方维护的,能适配它的表结构变化,不用自己维护实体映射。
方法2:手动创建实体映射
如果你更习惯用Doctrine的实体和Repository模式,可以手动为这些表创建实体类,映射到对应的数据库表。
比如针对translations表创建实体:
// src/Entity/LexikTranslation.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] #[ORM\Table(name: 'translations')] // 对应数据库中的表名 class LexikTranslation { #[ORM\Id] #[ORM\GeneratedValue(strategy: 'IDENTITY')] #[ORM\Column(type: 'integer')] private ?int $id = null; #[ORM\Column(name: 'locale', type: 'string', length: 10)] private ?string $locale = null; #[ORM\Column(name: 'domain', type: 'string', length: 191)] private ?string $domain = null; #[ORM\Column(name: 'key', type: 'string', length: 191)] private ?string $key = null; #[ORM\Column(name: 'value', type: 'text', nullable: true)] private ?string $value = null; // 生成对应的getter和setter方法 public function getId(): ?int { return $this->id; } public function getLocale(): ?string { return $this->locale; } // ...其他getter和setter }
创建完实体后,你可以生成对应的Repository(或者手动创建),然后就像操作普通实体一样使用Doctrine来查询了:
$translations = $this->getDoctrine() ->getRepository(LexikTranslation::class) ->findBy(['locale' => 'en', 'domain' => 'messages']);
方法3:使用Doctrine原生SQL或DQL
如果只是临时查询或者简单需求,也可以直接用Doctrine执行原生SQL或者DQL语句:
$entityManager = $this->getDoctrine()->getManager(); // 原生SQL示例 $sql = 'SELECT * FROM translations WHERE locale = ? AND domain = ?'; $stmt = $entityManager->getConnection()->prepare($sql); $stmt->execute(['en', 'messages']); $translations = $stmt->fetchAllAssociative(); // 或者用DQL(如果已经创建了实体的话) $query = $entityManager->createQuery( 'SELECT t.id, t.locale, t.key, t.value FROM App\Entity\LexikTranslation t WHERE t.locale = :locale AND t.domain = :domain' )->setParameters(['locale' => 'en', 'domain' => 'messages']); $translations = $query->getResult();
总结一下,优先用方法1,官方服务最稳妥;如果需要和现有Doctrine实体体系整合,用方法2;临时查询用方法3就够了。
内容的提问来源于stack exchange,提问作者learningsymfony
相关产品推荐
相关产品推荐

