You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:33:16