本文已参与「新人创作礼」活动,一起开启掘金创作之路。
你是否遇到过:要获取一些业务数据,需要join连接多个表才能够去到对应的数据?可是性能方面又怎么处理?以下封装的函数适用于单独获取各个表的数据集,后通过PHP封装方法以易理解写法进行数据的组装。
数据集连接处理方法相关参数api文档
formatJoinData(array $data, array $joinData, array $join, array $field)
| 参数 | 必填 | 类型 | 备注 | |---|---|---|---|---|---| | joinData| 是 | array | 要进行关联的数据集,需要起别名作为键名,各数据集也需包含自身用于关联的字段 | | field| 是 | array| 最终输出的结果数据集包含的字段,其中关联数据集来的需要起别名,主数据集的字段不需起别名 |
/**
* @param array $data 主数据集,以它为循环体
* @param array $joinData 要进行关联的数据集,需要起别名
* @param array $join 主数据集和关联数据集间的关联字段联系,必须确保字段对应
* @param array $field 最终输出的数据集所包含的字段
* @return array
*/
function formatJoinData(array $data, array $joinData, array $join, array $field)
{
$joinDataRelation = [];
foreach ($join as $mainKey => $joinKey) {
list($joinDataName, $joinDataKey) = explode('.', $joinKey);
$joinDataRelation[$joinDataName] = [
'mainKey' => $mainKey,
'joinKey' => $joinDataKey
];
}
$fieldArr = [];
foreach ($field as $fieldItem) {
if (strpos($fieldItem, '.') === false) {
$fieldArr[] = $fieldItem;
} else {
list($dataName, $dataField) = explode('.', $fieldItem);
$fieldArr[$dataName][] = $dataField;
}
}
foreach ($joinData as $joinDataName => $joinDataItem) {
$joinData[$joinDataName] = array_column($joinDataItem, null, $joinDataRelation[$joinDataName]['joinKey']);
}
$finalData = [];
foreach ($data as $item) {
$finalDataItem = [];
foreach ($fieldArr as $joinDataName => $fieldItem) {
//如果是数字,代表是主的
if (is_string($fieldItem)) {
$finalDataItem[$fieldItem] = $item[$fieldItem];
} else {
foreach ($fieldItem as $key) {
$mainKey = $joinDataRelation[$joinDataName]['mainKey'];
$finalDataItem[$key] = $joinData[$joinDataName][$item[$mainKey]][$key];
}
}
}
$finalData[] = $finalDataItem;
}
return $finalData;
}
使用示例:
$a = json_decode('[{"id":54975,"city_code":"STO","country_iso_code":"SE"},{"id":46106,"city_code":"ZRH","country_iso_code":"CH"},{"id":34064,"city_code":"TPE","country_iso_code":"TW"}]', true);
$b = json_decode('[{"hotel_id":34064,"hotel_name":"Caesar Park Hotel Taipei"},{"hotel_id":46106,"hotel_name":"Hotel Ascot"},{"hotel_id":54975,"hotel_name":"Freys Hotel"}]', true);
$c = json_decode('[{"city_code":"STO","city_name":"\u65af\u5fb7\u54e5\u5c14\u6469","ios_country_code":"SE"},{"city_code":"TPE","city_name":"\u53f0\u5317","ios_country_code":"TW"},{"city_code":"ZRH","city_name":"\u82cf\u9ece\u4e16","ios_country_code":"CH"}]', true);
$d = json_decode('[{"ios_country_code":"SE","country_name":"\u745e\u5178"},{"ios_country_code":"CH","country_name":"\u745e\u58eb"},{"ios_country_code":"TW","country_name":"\u4e2d\u56fd\u53f0\u6e7e"}]', true);
$res = formatJoinData(
$a,
[
'b' => $b,
'c' => $c,
'd' => $d,
],
[
'id' => 'b.hotel_id',
'city_code' => 'c.city_code',
'country_iso_code' => 'd.ios_country_code'
],
[
'id',
'b.hotel_name',
'c.ios_country_code',
'c.city_name',
'd.country_name'
]
);
print_r($res);