如何用Laravel 7查询构建器关联一对多表并生成指定结构数据
Laravel 7 实现指定结构的关联查询
方法一:使用 Eloquent 关联(推荐)
先给两张表创建对应模型并定义关联关系:
定义模型关联
假设主表名为 names,关联表名为 files,创建以下模型:
// app/Name.php namespace App; use Illuminate\Database\Eloquent\Model; class Name extends Model { protected $table = 'names'; // 替换为你的实际主表名 // 定义一对多关联 public function files() { return $this->hasMany(File::class, 'name_id', 'id'); } }
// app/File.php namespace App; use Illuminate\Database\Eloquent\Model; class File extends Model { protected $table = 'files'; // 替换为你的实际关联表名 }
查询并整理结构
通过模型查询后,提取所需字段并格式化:
$name = \App\Name::find(82); $data = [ 'id' => $name->id, 'file_name' => $name->files->pluck('file')->toArray() ];
方法二:纯查询构建器方式
如果不需要使用 Eloquent 模型,直接用查询构建器实现:
// 执行关联查询并聚合文件字段 $queryResult = DB::table('names') ->select('names.id', DB::raw('GROUP_CONCAT(files.file SEPARATOR "|") as file_list')) ->join('files', 'names.id', '=', 'files.name_id') ->where('names.id', 82) ->groupBy('names.id') ->first(); // 转换为目标结构 $data = [ 'id' => $queryResult->id, 'file_name' => explode('|', $queryResult->file_list) ];
注意:如果文件名可能包含
|符号,需要更换为一个不会在文件名中出现的分隔符,比如###,同时修改GROUP_CONCAT和explode中的对应符号。
内容的提问来源于stack exchange,提问作者adam abdul aziz
相关产品推荐
相关产品推荐

