2020-02-28 18:59:27
围观(3792)
博主以前在项目上遇到需要多表查询的需求都是直接使用模型关联。
代码是这样的(Model):
public function detail() { return $this->where(...) ->with('user'); } public function user() { return $this->belongsTo('AppUser'); }
这样很容易就可以多表查询,查询一个详情的时候会预加载 User 模型。
但是有个小问题,就是每次执行模型的 detail 方法,就会执行了预加载 User 模型,导致有时候仅仅需要查询详情而浪费性能(虽然浪费的性能不多)。
所以博主推荐一个方法,就是在逻辑处理使用 Map 方法。
比如一个文章表和一个评论表和用户表。进入文章需要获取到评论和发布评论的用户。
就可以先通过文章 ID 获取到评论的数据,评论的记录必定是一条评论有一个评论用户的 ID。
可以创建一个新的数组,将这些评论的用户 ID 存入数组。
然后一次性把这些用户查询出来,再将这些用户的数据处理一下,把用户的 ID 作为数组下标(Key)。
就可以简单的得到用户信息,且没用到预加载等方法。
下面是伪代码:
$article_id = 1; // 假设文章 ID 为 1 // 获取到所有评论 $model_comment = new Comment(); $rows_comment = $model_comment->get_comment_by_article_id($article_id); // 获取所有评论的用户 $array_user_id = array_column($rows_comment, 'user_id'); $model_user = new User(); $rows_user = $model_user->get_all_user_by_id($array_user_id); // 接下来就是设置用户的 ID 作为用户数组 $rows_user 的下标(Key) $new_rows_user = []; foreach ($rows_user as $key => $value) { $new_rows_user[$value['id']] = $value; } dump($new_rows_user); // 打印可以发现 这个数组的下标(Key)就是用户的 ID // 要获取某个评论的某个用户信息可以这样: dump($new_rows_user[$rows_comment['user_id]]);
其实最关键词的就是 array_column 获取到用户的 ID,其次就是对数组下标(Key)进行处理,
可以将处理数组下标(Key)的方法进行封装到“工具类”,方便调用。
function set_index($array, $key_name = 'id') { $new_array = []; foreach ($array as $key => $value) { $new_array[$value[$key_name]] = $value; } return $new_array; }
假如一个评论又有多个用户,则需要将上方的方法改成这样:
function set_index_multidimensional($array, $key_name = 'id') { $new_array = []; foreach ($array as $key => $value) { $new_array[$value[$key_name]][] = $value; } return $new_array; }
还有很多喜欢在循环里面查库的(包括博主之前)其实非常消耗性能。
比如这样(伪代码):
foreach ($rows_article as $row_article) { // 查询评论 // 再查用户 }
本文地址 : bubaijun.com/page.php?id=166
版权声明 : 未经允许禁止转载!
上一篇文章: PHP使用经纬度获取两个位置的距离及范围查询
下一篇文章: 简单使用Laravel 7的Airlock