有没有办法根据 laravel 中相同模型中的值获得不同的值以及行数?
Posted
技术标签:
【中文标题】有没有办法根据 laravel 中相同模型中的值获得不同的值以及行数?【英文标题】:Is there any way to get distinct value along with row count based on that value in same model in laravel? 【发布时间】:2021-09-17 23:36:09 【问题描述】:我的项目表上有 13,000 多个项目,包括多个项目中的相似标签(Json 表单)。我与物品和标签没有任何关系或模型。如何在没有太多内存分配的情况下在每个标签上获得具有项目计数的标签的不同值(包含此标签的项目)?
我想在这样的表格中显示它们 -
SL----------Tag-----
1-----------responsive [3 items available of this tag]
2-----------mobile [124 items available of this tag]
项目表就像 -
【问题讨论】:
请向我们展示 Items 表和任何其他相关表的架构 在这张桌子上工作,我必须根据同一张桌子的标签的值来计算这张桌子的项目。tags
列是包含一个标签还是标签的分隔列表?
标签列表作为 JSON 对象,如上述示例。
我认为您现在应该看到此表中的设计错误。如果您有一个标签表和一个链接表来与此相关的任何内容 那么这些计数将很容易通过简单地计算链接表行来实现。有了这种设计,过程就复杂得多
【参考方案1】:
假设您尝试通过 mysql 查询来实现这一点,我正在考虑几个步骤来实现这一点:
-
从
tags
列中的JSON
值将[项目+每个标签] 组合转换为行。我从this answer 得到了这个想法,但是为了生成sequenceNumber
,我使用WITH RECURSIVE
来获取动态值。此外,我使用LENGTH()
和REPLACE()
方法来获取所有项目中出现的标签数量,然后使用MAX()
来获取最大数量。这里我使用rnum
作为序列号。
CROSS JOIN
上面生成的rnum
与您的表(在此示例中名称为mytable
)一起实现我提到的链接答案中的操作。
添加COUNT(*)
并按不返回NULL
的每个标签对其进行分组。
最后的查询是这样的:
SELECT CONCAT(tagsVal,' [', COUNT(tagsVal),' Items available for this tag]') AS tag
FROM
(WITH RECURSIVE tblrows AS(
SELECT 0 AS rnum, MAX((LENGTH(t)-LENGTH(REPLACE(t,',',''))) +1) AS maxtags
FROM
(SELECT Item, JSON_UNQUOTE(tags) AS t FROM mytable) A UNION ALL
SELECT rnum+1, maxtags FROM tblrows WHERE rnum+1 <= maxtags)
SELECT rnum, item, JSON_UNQUOTE(tags),
JSON_EXTRACT(tags, CONCAT('$[', rnum, ']')) AS tagsVal
FROM tblrows t CROSS JOIN mytable m
) sq1
WHERE tagsVal IS NOT NULL
GROUP BY tagsVal;
Here's a demo fiddle
【讨论】:
以上是关于有没有办法根据 laravel 中相同模型中的值获得不同的值以及行数?的主要内容,如果未能解决你的问题,请参考以下文章