【发布时间】:2025-12-24 02:50:12
【问题描述】:
更新:以下是上下文,但我发现这不是问题所在。
我对 php 和 laravel 还是很陌生。我对使用来自存储库的 postgresql 查询的控制器进行 AJAX 调用。该查询是一个选择查询,它有列日期、total_sms 和演示(演示是性别男/女)。
我有一个数组 $return[] 下面在一个 foreach 中($result 为 $day)。 最后,数组在返回之前被转换为 json。
$return[$day->dated][$day->demo] = $day->total_sms;
我希望上面将日期作为带有数组值的键插入,性别(男性和女性)作为内部数组的键,它们有一个数组作为值,这些数组将包含 total_sms 值. (那句话一定很混乱……)
但是结果是:
{2017-07-03: {d.gender: "0"}, 2017-07-04: {d.gender: "0"}}
我将如何构建这样的数组:
{2017-07-03: {Male: "0" , Female: "10"}, 2017-07-04: {Male: "0", Female: "0"}
虽然我认为上面的内容实际上并不是我最初描述的方式?我正计划对其进行解码并将信息粘贴到 chart.js 图表中:
$.each(d, function(date, value) {
window.barChart.data.labels.push(date);
$.each(d.date, function(demographic, value) {
// ALWAYS ASCENDING DATA
});
更新:造成问题的代码。
我在存储库中有一个查询,可以插入不同的参数,以更改使用的人口统计数据。下面是我在pgAdmin中使用的版本,效果很好。
SELECT d.date dated, count(se.id) total_sms, demo
FROM (
select to_char(date_trunc('day', (current_date - offs)), 'YYYY-MM-DD') AS date, demographic.gender as demo
FROM generate_series(0, 365, 1) AS offs
CROSS JOIN (SELECT DISTINCT gender FROM common.profile) AS demographic
) d
LEFT OUTER JOIN (
SELECT id, customer_id, client_report.insert_time, profile.gender, profile.house_income, profile.address AS postcode, profile.age AS age_group, profile.is_employed, profile.is_married, profile.no_children, profile.no_cars, profile.shopping_frequency
FROM common.client_report
JOIN common.profile
ON client_report.profile_id = profile.uuid
WHERE sms_status = 'SUCCESS' AND customer_id = 5::int
) se
ON (d.date=to_char(date_trunc('day', se.insert_time), 'YYYY-MM-DD')) AND demo = gender
WHERE d.date::date BETWEEN '2017-07-01'::date AND '2017-08-01'::date
GROUP BY d.date, demo
ORDER BY d.date, demo ASC;
任何声明性别、日期或 AND customer_id = 之后的 5 都是从命名参数生成的(当我收到错误时,我通常可以修复它,当没有错误时,代码有效,但给我性别作为列名称 ['de.gender'] 而不是值 ['Male', 'Female'])。我的意思是说我在参数方面有错误,不再相信这可能是问题所在。然后我会收到一个关于缺少未知文本的转换工具的错误。我不完全理解这一点,但我知道这意味着我必须使用 ::text 将性别转换为文本。这样做会导致出现列名。但是,在没有交叉连接的情况下,在一个不同的、更简单的查询中这样做,结果是正确的。这让我相信我的查询方式存在问题,或者数据库驱动程序和这些查询存在错误。
更新:做了一个测试,应该早点做!将不带参数的版本放入我的应用程序中,使函数运行,并完全根据需要返回。所以这源于参数,并且可能是定义表的参数,例如 de.gender(de 是表)
更新:另一个测试:
CROSS JOIN (SELECT DISTINCT gender FROM common.profile) AS demographic
在这一行中,gender 是一个命名参数 (:demograph)。但是,如果我将其更改为简单的性别,则结果与男性、女性值的预期一致。如果它保留为参数,它似乎是在创建大量“性别”字符串,而不是获取“男性”、“女性”值。
更新:今天做了很多学习,命名或位置参数仅用于值。这意味着所有输入都用双引号引起来,这就是为什么我要创建“性别”字符串而不是男性、女性。
【问题讨论】:
-
你的循环中有返回语句吗?
-
我知道,我意识到问题不是源于上面的代码。它来自我的查询。它可以通过 pgAdmin 正常工作,但不能通过 eloquent DB
标签: php database postgresql laravel chart.js