在Extbase查询中执行非标准JOIN以获取无翻译的全部记录
在Extbase中实现带同表LEFT JOIN的多语言查询
核心思路
Extbase的Query API不支持显式的同表JOIN,但可以通过**notExists()约束模拟无关联记录的判断**,结合手动语言条件,实现你需要的SQL逻辑,同时保留Extbase持久化的对象自动解析能力,避免用QueryBuilder后手动处理数组转对象的麻烦。
实现代码
首先确保你的Job模型定义了翻译记录的反向关联,然后使用以下查询代码:
1. 模型关联配置(必须)
在tx_unioljobs_domain_model_job对应的PHP模型中,添加反向关联字段,对应翻译记录的l10n_parent:
<?php namespace Tx\Unioljobs\Domain\Model; use TYPO3\CMS\Extbase\DomainObject\AbstractEntity; use TYPO3\CMS\Extbase\Persistence\ObjectStorage; class Job extends AbstractEntity { /** * 关联的翻译记录(反向引用,对应l10n_parent字段) * @var ObjectStorage<Job> * @TYPO3\CMS\Extbase\Annotation\ORM\InverseSide * @TYPO3\CMS\Extbase\Annotation\ORM\JoinColumn(name="l10n_parent", referencedColumnName="uid") */ protected $localized; public function __construct() { $this->localized = new ObjectStorage(); } /** * @return ObjectStorage<Job> */ public function getLocalized() { return $this->localized; } }
2. Extbase Query实现代码
在你的Repository类中,编写查询方法:
public function findForEnglishPage() { $query = $this->createQuery(); $querySettings = $query->getQuerySettings(); // 关闭自动语言过滤,我们手动控制多语言逻辑 $querySettings->setRespectSysLanguage(false); // 按需保留:确保只查询已启用的记录 $querySettings->setIgnoreEnableFields(false); $query->setQuerySettings($querySettings); // 约束1:直接获取英语记录(sys_language_uid=1) $englishJobs = $query->equals('sysLanguageUid', 1); // 约束2:德语记录(sys_language_uid=0)且没有对应的英语翻译 $germanJobsWithoutEnglish = $query->logicalAnd( $query->equals('sysLanguageUid', 0), // 判断是否不存在语言为1的翻译记录 $query->notExists( 'localized', $query->equals('sysLanguageUid', 1) ) ); // 合并约束:满足任一条件即可 $finalConstraint = $query->logicalOr($englishJobs, $germanJobsWithoutEnglish); $query->matching($finalConstraint); // 返回Extbase持久化对象集合,自动解析关联 return $query->execute(); }
代码与目标SQL的对应关系
这段代码生成的SQL逻辑和你给出的完全一致:
$query->notExists('localized', ...)对应SQL中的LEFT OUTER JOIN tx_unioljobs_domain_model_job AS job2 ON job2.l10n_parent=job1.uid WHERE job2.uid IS NULL- 两个逻辑或的约束对应
(job2.uid IS NULL AND sys_language_uid=0) OR sys_language_uid=1
优势说明
- 直接返回Extbase的
Job对象集合,自动解析所有关联字段,无需手动处理数组映射 - 完全遵循Extbase的开发流程,和现有插件的列表/视图逻辑兼容
- 比单独查询UID再批量获取的方式更高效,代码更简洁
内容的提问来源于stack exchange,提问作者Sybille Peters
相关产品推荐
相关产品推荐

