You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:52:52