不败君

前端萌新&初级后端攻城狮

Laravel多表查询优化

Laravel多表查询优化

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

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语