有没有办法根据 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 中相同模型中的值获得不同的值以及行数?的主要内容,如果未能解决你的问题,请参考以下文章

如果 id 相同,Laravel 验证唯一性

2个页面可以使用相同的视图模型吗?

Laravel 4 - 根据用户数据库中的值显示不同的视图

如何在 Laravel 查询生成器上最小化“where()”。如果所有表列都是相同的值

排除 Laravel 会附加模型结果中的值

有没有办法检查 laravel 5.2 中的几个输入是不是唯一?