Laravel中如何获取两张表不同列名的无重复月份数据
解决从两表提取无重复月份的问题
你的当前代码用了crossjoin,这会生成两张表的笛卡尔积,得到的是所有month和retainer_month的组合,完全达不到合并去重的需求。要获取两个表中所有无重复的月份,应该用UNION来合并两个查询结果,UNION会自动去重。
正确的Laravel查询代码
// 先定义第一个查询:获取project表的month列 $projectMonths = DB::table('project_cashflow_attrs') ->select('month'); // 合并retainer表的月份列(重命名为统一的month),自动去重 $overallMonth = DB::table('retainer_cashflow_attrs') ->select('retainer_month as month') ->union($projectMonths) // 可选:按月份时间顺序排序(针对"May-2023"这类字符串格式) ->orderBy(DB::raw("STR_TO_DATE(month, '%b-%Y')")) ->get();
关键说明
- 列名统一:必须把
retainer_month重命名为month,确保两个查询的返回列名一致,UNION才能正常合并。 - 自动去重:
union()方法默认会去除重复条目,不需要额外的groupBy或distinct(若需更明确也可添加->distinct())。 - 正确排序:如果月份是"May-2023"这类文本格式,直接用
orderBy('month')会按字母排序(比如Dec-2023会排在Jan-2023前面),用STR_TO_DATE把字符串转成日期再排序,能保证时间顺序正确。
结果示例
执行后会得到类似如下的无重复有序集合:
[ {"month": "May-2023"}, {"month": "June-2023"}, {"month": "July-2023"}, ... ]
内容的提问来源于stack exchange,提问作者Pradeep Kumar
相关产品推荐
相关产品推荐

