如何获取特定列laravel中所有可能具有最高值的记录

问题描述 投票:0回答:1

我有四张桌子:

物品:

id 名字
1 第 1 项
2 第 2 项

项目模块:

item_id 模块_id
1 1
1 2
1 3

模块:

id 名字 类型
1 模块1 类型_1
2 模块2 类型_2
3 模块3 类型_2
4 模块 4 类型_3

输入优先级:

id 类型 优先
1 类型_1 14
2 类型_2 20
3 类型_3 27

项目可以有许多模块。模块按其类型具有优先级。我怎样才能获得所有具有最高优先级的项目模块?因此,该表的结果应该是具有“模块 2”和“模块 3”的项目,因为该项目没有“模块 4”,并且“模块 1”的优先级低于“模块 2”和“模块 3”。所以输出的 ex 是

items [
id: 1,
name: item 1,
modules: [
   [
     id: 2,
     name: module 2
   ],
   [
     id: 3,
     name: module 3
   ]
]
]

表格结果应如下所示:

item_id 商品名称 模块_id 模块名称
1 第 1 项 2 模块2
1 第 1 项 3 模块3

但是如果我们为项目添加“模块 4”,那么项目应该只有“模块 4”。仅当我们删除所有其他模块时,“模块 1”才应出现在输出中

php laravel database eloquent
1个回答
0
投票

你可以添加一个带有查询的where子句,像这样

select i.itemid,
       i.itemname,
       m.moduleid,
       m.modulename,
       p.priority
from   items i
  inner join itemmodule im on i.itemid = im.itemid
  inner join module m on im.moduleid = m.moduleid
  inner join priority p on m.type = p.type
where  p.priority = ( select max(p2.priority)
                      from   priority p2
                        inner join module m2 on p2.type = m2.type
                        inner join itemmodule im2 on m2.moduleid = im2.moduleid
                      where    im2.itemid = i.itemid
                    )

这将检索所有表中具有连接的所有项目,
然后过滤掉那些不是最高优先级的

返回您的数据

项目中 商品名称 模块ID 模块名称 优先
1 项目 1 2 模块2
1 项目 1 3 模块3

如果我添加模块 4,结果是

项目中 商品名称 模块ID 模块名称 优先
1 项目 1 4 模块 4
© www.soinside.com 2019 - 2024. All rights reserved.