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
相关产品推荐
相关产品推荐

