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

使用$wpdb执行INNER JOIN后如何返回嵌套结构查询结果?

解决WordPress $wpdb JOIN查询字段覆盖与嵌套结构问题

核心结论

SQL本身只能返回扁平的二维结果集,没法直接生成嵌套的对象结构。你需要先通过字段别名避免同名字段覆盖,再用PHP循环把数据重组为嵌套格式。

步骤1:编写带别名的JOIN查询

给冲突的id、name字段分别起别名,确保Versions和Languages的字段不会互相覆盖:

// 用$wpdb->prefix自动获取WordPress表前缀
$query = $wpdb->prepare("
    SELECT 
        -- Versions表字段,加别名区分
        v.id AS version_id,
        v.name AS version_name,
        v.description, -- 替换成你实际需要的Versions字段
        v.language_id,
        -- Languages表字段,加别名区分
        l.id AS lang_id,
        l.name AS lang_name,
        l.code -- 替换成你实际需要的Languages字段
    FROM {$wpdb->prefix}versions v
    INNER JOIN {$wpdb->prefix}languages l 
        ON v.language_id = l.id
");

// 获取关联数组格式的结果(方便后续处理)
$rawResults = $wpdb->get_results($query, ARRAY_A);

注意:尽量明确列出需要的字段,不要用SELECT *,避免冗余数据和意外的字段冲突。

步骤2:循环重组为嵌套结构

遍历原始结果,把Languages相关的字段抽出来做成嵌套的language对象/数组:

数组格式示例

$formattedData = [];
foreach ($rawResults as $row) {
    // 组装language子结构
    $language = [
        'id' => $row['lang_id'],
        'name' => $row['lang_name'],
        'code' => $row['code']
    ];

    // 组装最终的version结构,嵌套language
    $formattedData[] = [
        'id' => $row['version_id'],
        'name' => $row['version_name'],
        'description' => $row['description'],
        'language' => $language
    ];
}

对象格式示例(如果需要stdClass)

$formattedData = [];
foreach ($rawResults as $row) {
    $language = new stdClass();
    $language->id = $row['lang_id'];
    $language->name = $row['lang_name'];
    $language->code = $row['code'];

    $version = new stdClass();
    $version->id = $row['version_id'];
    $version->name = $row['version_name'];
    $version->description = $row['description'];
    $version->language = $language;

    $formattedData[] = $version;
}

为什么不能直接用SQL实现嵌套结构?

SQL的查询结果本质是二维表格,所有字段都是平级的,没有嵌套层级的概念。不管怎么写JOIN,返回的都是一行行平级的字段,没法直接输出嵌套的对象/数组结构,必须通过后端代码二次处理。

内容的提问来源于stack exchange,提问作者Alaksandar Jesus Gene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:22:46