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

Laravel:如何从多张表获取独立数组形式的数据

解决Laravel查询中嵌套关联数据的问题

方法1:利用Eloquent关联(最推荐)

如果你的项目中有定义模型,这是最简洁的方式。首先在Feeds模型里定义与FeedMappings的一对多关联:

// app/Models/Feeds.php
class Feeds extends Model
{
    protected $table = 'feeds';
    // 若需指定数据库连接,可在查询时动态设置

    public function feedMappings()
    {
        return $this->hasMany(FeedMappings::class, 'id_feed', 'id_feed');
    }
}

接着通过预加载关联来获取嵌套结构的数据:

$dbName = $get_db_name[0]->mysql_db_name;

$get_import_info = Feeds::on($dbName)
    ->where('id_project', $token)
    ->with('feedMappings')
    ->get();

返回结果中,每个feeds条目都会包含一个feedMappings属性,对应该feed下所有关联的feed_mappings数据数组。

方法2:用DB门面手动处理结果

如果不想依赖Eloquent模型,可以选择以下两种方式:

方式A:分两次查询

先获取所有符合条件的feeds,再循环为每个feed匹配对应的feed_mappings:

$dbName = $get_db_name[0]->mysql_db_name;

// 第一步:获取feeds数据
$feeds = DB::table($dbName . '.feeds')
    ->where('id_project', $token)
    ->get();

// 第二步:为每个feed添加关联的feed_mappings数组
foreach ($feeds as $feed) {
    $feed->feed_mappings = DB::table($dbName . '.feed_mappings')
        ->where('id_feed', $feed->id_feed)
        ->get();
}

方式B:利用MySQL聚合函数(MySQL 5.7+适用)

通过JSON_AGG函数将关联数据聚合为JSON数组,一次查询完成嵌套结构的构建:

$dbName = $get_db_name[0]->mysql_db_name;

$get_import_info = DB::table($dbName . '.feeds')
    ->select(
        'feeds.*',
        DB::raw('COALESCE(JSON_AGG(feed_mappings.*), "[]") as feed_mappings')
    )
    ->leftJoin($dbName . '.feed_mappings', 'feed_mappings.id_feed', '=', 'feeds.id_feed')
    ->where('feeds.id_project', $token)
    ->groupBy('feeds.id_feed')
    ->get();

这里用COALESCE确保没有关联数据时返回空数组而非null,结果中的feed_mappings字段就是独立的关联数据数组。

内容的提问来源于stack exchange,提问作者Shibbir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:45:44