【问题标题】:laravel show two tables data grouped as onelaravel 显示两个表数据分组为一个
【发布时间】:2020-03-13 23:39:07
【问题描述】:

我有两个表名为pathsstoppages,结构如下:

路径:

_____________________________
| id | source | destination |
|____|________|_____________|
|  1 |   a    |    b        |
|____|________|_____________|
|  2 |   a    |    c        |
|____|________|_____________|
|  3 |   d    |    e        |
|____|________|_____________|

停页:

________________________
| id | path_id | point |
|____|_________|_______|
|  1 |   1     |   p1  |
|____|_________|_______|
|  1 |   1     |   p2  |
|____|_________|_______|
|  1 |   1     |   p3  |
|____|_________|_______|
|  1 |   2     |   p4  |
|____|_________|_______|
|  1 |   2     |   p5  |
|____|_________|_______|
|  1 |   3     |   p1  |
|____|_________|_______|

我从两个表中获取数据的查询是

DB::table('paths')->join('stoppages', 'paths.id', '=', 'stoppages.path_id')->get()

我想在一张表格的 laravel 刀片页面中显示它们。目前我的桌子是这样的:

________________________________________
| source | destination |   stoppages   |
|________|_____________|_______________|
|   a    |     b       |       p1      |
|________|_____________|_______________|
|   a    |     b       |       p2      |
|________|_____________|_______________|
|   a    |     b       |       p3      |
|________|_____________|_______________|
|   a    |     c       |       p4      |
|________|_____________|_______________|
|   a    |     c       |       p5      |
|________|_____________|_______________|
|   d    |     e       |       p1      |
|________|_____________|_______________|

但我想以以下格式显示它们?

________________________________________
| source | destination |   stoppages   |
|________|_____________|_______________|
|   a    |     b       |   p1, p2, p3  |
|________|_____________|_______________|
|   a    |     c       |     p4, p5    |
|________|_____________|_______________|
|   d    |     e       |       p1      |
|________|_____________|_______________|

如何以我想要的格式显示这些数据?

【问题讨论】:

  • 我更新了我的问题。请立即检查。

标签: laravel join


【解决方案1】:

GROUP_CONCAT 函数返回一个字符串结果,其中包含来自组的连接的非 NULL 值

您可以像这样使用groupBygroup_concat

DB::table('paths')
  ->join('stoppages', 'paths.id', '=', 'stoppages.path_id')
  ->groupBy('source', 'destination')
  ->select('source', 'destination', DB::raw('GROUP_CONCAT(stoppages separator ", ") AS stoppages'))
  ->get()

【讨论】:

  • 在 select() 中添加 'paths.id' 给我错误 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db_graph.paths.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select paths.id, source, destination, GROUP_CONCAT(stoppages separator ", ") AS stoppages from paths` 内部连接 ​​stoppages on @ 987654331@.id = stoppages.path_id group by source, destination)`你能提供任何解决方案吗?
  • @MdYeamin 因为你的mysql版本是5.75+,所以它有ONLY_FULL_GROUP_BY模式,它只允许你选择除聚合函数之外的分组列。您可以使用DB::raw(any_value(paths.id)),或关闭ONLY_FULL_GROUP_BY 模式。检查此链接stackoverflow.com/questions/60518382/…
  • any_value 也报错,DB::raw('min(paths.id) as id'), 救了我。
【解决方案2】:

不要使用查询生成器,而是使用 eloquent。

Path::with('stoppages')->get();

Path.php模型中做:

public function stoppages()
{
    return $this->hasMany(Stoppage::class, 'path_id');
}

其中 Path 和 Stoppage 分别是 path 和 stoppages 表的模型。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多