单独表数据集连接处理-仿join的PHP处理函数

113 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


你是否遇到过:要获取一些业务数据,需要join连接多个表才能够去到对应的数据?可是性能方面又怎么处理?以下封装的函数适用于单独获取各个表的数据集,后通过PHP封装方法以易理解写法进行数据的组装。

数据集连接处理方法相关参数api文档

formatJoinData(array $data, array $joinData, array $join, array $field)

| 参数 | 必填 | 类型 | 备注 | |---|---|---|---|---|---| | dataarray主数据集,以它为循环体,需要包含有自身用于关联的字段,无别名data | 是 | array| 主数据集,以它为循环体,需要包含有自身用于关联的字段,无别名 | | joinData| 是 | array | 要进行关联的数据集,需要起别名作为键名,各数据集也需包含自身用于关联的字段 | | joinarray主数据集(键名,无别名)和关联数据集(键值,需对应的别名)间的关联字段联系,必须确保字段对应join| 是 | 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);