关联查询
1. 运行环境
1). 当前使用的 Laravel 版本?
8.x
2). 当前使用的 php/php-fpm 版本?
PHP 版本:7.4
php-fpm 版本:
3). 当前系统
Windows 10
4). 业务环境
5). 相关软件版本
2. 问题描述?
$list = BookCategory::query()
->with(['book' => function ($query) {
$query->where('status', 1)->orderByDesc('sorts')->select('id', 'name');
}])
->get()
->toArray();
为什么加上
->select('id', 'name')
后关联数据为[]
如下:array:1 [ 0 => array:7 [ "id" => 1 "name" => "山" "sorts" => 0 "status" => 1 "created_at" => "2023-04-14 14:43:00" "updated_at" => "2023-04-14 14:43:00" "book" => [] ] ]
而去除掉
->select('id', 'name')
却正确返回关联数据,如下:array:1 [ 0 => array:7 [ "id" => 1 "name" => "山" "sorts" => 0 "status" => 1 "created_at" => "2023-04-14 14:43:00" "updated_at" => "2023-04-14 14:43:00" "book" => array:1 [ 0 => array:15 [ "id" => 1 "category_id" => 1 "name" => "渊海子平" "author" => "徐太升" "dynasty" => "宋" "wordage" => "30.95" "read_num" => 0 "imgurl" => "images/2023/04/14/4613b62021733552b8cb6cb19f101ec1.jpeg" "press" => "未知" "add_bookshelf_num" => 0 "sorts" => 0 "status" => 1 "created_at" => "2023-04-14 16:18:25" "updated_at" => "2023-04-14 16:27:21" ] ] ] ]
->select('id', 'name','category_id')
加上关联健,with 查询的原理是一次性将 book 查询出来的数组,再按照 category_id 挂载到所属分类,所以能解决 N+1 的问题,没有关联的键,自然就不知道挂载到哪个分类。