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

如何使用Laravel Eloquent简化关联表数据检索(按分类分组标签)

更简便的关联表数据分组查询方法

针对你的需求,最简便的方式是在数据库层完成分组拼接,再在应用层转换格式,比先查所有数据再循环分组更高效简洁。

1. 原生SQL实现

通过INNER JOIN关联两张表,结合GROUP_CONCAT将同一分类下的标签名拼接成字符串,再在代码中拆分:

SELECT 
    c.Name AS category_name, 
    GROUP_CONCAT(t.Name SEPARATOR ',') AS tags
FROM Categories c
INNER JOIN Tags t ON c.ID = t.Category_ID
GROUP BY c.ID, c.Name;

PHP端转换为目标数组(以PDO为例)

// 假设已建立PDO连接
$sql = "SELECT c.Name AS category_name, GROUP_CONCAT(t.Name SEPARATOR ',') AS tags FROM Categories c INNER JOIN Tags t ON c.ID = t.Category_ID GROUP BY c.ID, c.Name";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

$categoryTags = [];
foreach ($rows as $row) {
    $categoryTags[$row['category_name']] = explode(',', $row['tags']);
}

// 输出结果即为你需要的格式
print_r($categoryTags);

2. ORM框架简化(以Laravel Eloquent为例)

如果使用ORM框架,代码会更简洁,无需手动写SQL:

// 先确保Category模型已定义与Tag的关联关系:
// Category.php
public function tags()
{
    return $this->hasMany(Tag::class, 'Category_ID');
}

// 然后直接查询并转换格式
$categoryTags = Category::with('tags')
    ->get()
    ->mapWithKeys(function ($category) {
        return [$category->name => $category->tags->pluck('name')->toArray()];
    })
    ->toArray();

这种方式既减少了代码量,也利用了ORM的关联查询优化,可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:42:48