AQL查询实现嵌套多语言翻译字段的指定语言筛选
多语言翻译文档的AQL查询方案(指定双语言+默认 fallback)
需求背景
现有多语言翻译文档结构如下:
texts:{ id1:{ "en":"welcome", "es":"bienvenido", "de":"Willkommen " }, id2:{ "en":"good bye", "es":"adios", "de":"tschüss" } }
需要通过单次AQL查询获取指定两种语言(如英文en和西班牙文es)的翻译内容,其中英文为默认语言——当目标语言无翻译内容时,自动 fallback 到英文。
核心AQL查询实现
1. 针对单个翻译ID的查询(硬编码示例)
直接指定目标ID和语言,返回包含英文和目标语言的翻译结果:
FOR doc IN translations RETURN { id1: { en: doc.texts.id1.en, es: COALESCE(doc.texts.id1.es, doc.texts.id1.en) } }
- 关键逻辑:
COALESCE函数会返回第一个非空/存在的值,自动实现"目标语言为空则用英文"的 fallback 逻辑。
2. 动态参数化查询(推荐,适配PHP调用)
通过绑定参数动态指定目标ID和语言,避免硬编码,提升复用性:
FOR doc IN translations RETURN { [@targetId]: { en: doc.texts[@targetId].en, [@targetLang]: COALESCE(doc.texts[@targetId][@targetLang], doc.texts[@targetId].en) } }
[@targetId]和[@targetLang]是AQL的动态属性语法,允许通过外部参数传入字段名。
3. 批量获取多个翻译ID的查询
如果需要同时获取多个ID的翻译,可结合MERGE函数实现:
FOR doc IN translations RETURN MERGE( FOR id IN @targetIds RETURN { [id]: { en: doc.texts[id].en, [@targetLang]: COALESCE(doc.texts[id][@targetLang], doc.texts[id].en) } } )
PHP中执行查询的完整代码示例
使用ArangoDB官方PHP驱动实现调用:
<?php require 'vendor/autoload.php'; use ArangoDBClient\Connection; use ArangoDBClient\Statement; // 1. 建立数据库连接 $connection = new Connection([ 'server' => 'tcp://localhost:8529', 'database' => 'your_database_name', 'authType' => 'basic', 'authUser' => 'your_username', 'authPasswd' => 'your_password' ]); // 2. 定义绑定参数(可根据业务动态调整) $bindVars = [ 'targetId' => 'id1', 'targetLang' => 'es' // 如果是批量查询,替换为: // 'targetIds' => ['id1', 'id2'], // 'targetLang' => 'es' ]; // 3. 编写AQL语句(对应上面的动态参数化版本) $query = <<<AQL FOR doc IN translations RETURN { [@targetId]: { en: doc.texts[@targetId].en, [@targetLang]: COALESCE(doc.texts[@targetId][@targetLang], doc.texts[@targetId].en) } } AQL; // 4. 执行查询并获取结果 $statement = new Statement($connection, ['query' => $query, 'bindVars' => $bindVars]); $cursor = $statement->execute(); $result = $cursor->getAll(); // 输出结果 print_r($result); ?>
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

