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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:22:14