在开发过程中,通常会遇到很多 一对一 数据的处理情况。
1、有的时候表格很大,只是需要按需取一部分的,连表可能造成锁表;
2、需要根据我后面的业务结果来决定是不是要加载一对一;
3、在后期分库分表,如果连表查询可能需要大量修改sql语句;
以上情况下 join 似乎就不太适合;也就衍生出了以下数据关联最佳实践。
比如下面得到的商品信息 和 商品详情 两个数组,这里为了演示只是使用了基础字段,实际开发中可能会复杂的多,下方只是演示代码。
/**
* 最佳实践:一对一数据关联
*/
public function get_goods_detail_list()
{
// 商品信息
$goods = [
['id' => 2135, 'price' => 1212],
['id' => 3245, 'price' => 1212],
['id' => 5342, 'price' => 1212],
['id' => 5341, 'price' => 1212],
['id' => 5623, 'price' => 1212]
];
// 商品详情
$goods_detail_list = [
['id' => 1, 'goods_id' => 2135, 'content' => 'Doe'],
['id' => 2, 'goods_id' => 3245, 'content' => 'Smith'],
['id' => 3, 'goods_id' => 5342, 'content' => 'Jones'],
['id' => 4, 'goods_id' => 5341, 'content' => 'Doe']
];
$goods_detail_list_by_keys = array_column($goods_detail_list, null, 'goods_id');
// 有时候数据有可能会因对不上,直接返回给前端,前端没有做容错处理就会导致前端页面崩溃
$goods_detail_default = ['id' => null, 'goods_id' => null, 'content' => null];
foreach ($goods as &$item) {
$tmp = array_key_exists($item['id'], $goods_detail_list_by_keys) ? $goods_detail_list_by_keys[$item['id']] : [];
$item['goods_detail'] = array_merge($goods_detail_default, $tmp);
}
// 直接用引用去操作源数据,最后别忘了 unset 掉最后的 $item
unset($item);
var_dump($goods);
}










网友评论