Laravel DB 选择语句。查询返回列名作为结果而不是值

Posted

技术标签:

【中文标题】Laravel DB 选择语句。查询返回列名作为结果而不是值【英文标题】:Laravel DB select statement. Query returns column name as result rather than values 【发布时间】:2017-08-01 16:31:56 【问题描述】:

更新:以下是上下文,但我发现这不是问题所在。

我对 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 【参考方案1】:

我不知道我不确定你的问题

$testArray = array(
            "2017-07-03" => array("male" : "0","female" => "10"),
            "2017-07-04" => array("male" : "0","female" => "0")
    );
    return $testArray;

【讨论】:

Laravel PHP 框架,带有 eloquent 和外观 DB。允许您连接到数据库并查询它。上面的 $day->dated、$day->total_sms 和 $day->demo 都是查询中的列。 $day 是 $result 的 foreach 值,result 是查询结果。基本上我的数组的开始和结束都按预期工作,但中间 ($day->demo) 似乎以完全相反的方式工作

以上是关于Laravel DB 选择语句。查询返回列名作为结果而不是值的主要内容,如果未能解决你的问题,请参考以下文章

来自DB的Laravel雄辩错误选择数据

Laravel查询以输出json数据作为选择列表。如何修改现有代码以连接两个值

SELECT 语句返回不合格的列名

Laravel 中的 DB Raw 查询错误

如何从laravel中的表中选择所有列名?

Laravel 查询生成器选择数组内的返回列