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