我一直遇到不断回复错误的雄辩。下面是我试图在laravel中运行的查询。
$actives = ProjectVersion::join('version_employees as ve', 've.report_id' ,'=', 'project_versions.id')
->join('employees as e', 've.employee_id', '=', 'e.id')
->whereBetween(\DB::raw("'1985-05-27'::date"),[
\DB::raw("to_date(timeline->>'start_time', 'YYYY-MM-DD')"),
\DB::raw("to_date(timeline->>'release_time', 'YYYY-MM-DD')")])
->groupBy('e.name')
->select(\DB::raw('count(e.id), e.name'))
->get();
现在返回错误
Invalid datetime format: 7 ERROR: invalid input syntax for type date: "to_date(timeline->>'start_time', 'YYYY-MM-DD')"
错误消息返回的完整查询是
SELECT count(e.id), e.name
FROM "project_versions" inner join "version_employees" as "ve" on "ve"."report_id" = "project_versions"."id" inner join "employees" as "e" on "ve"."employee_id" = "e"."id"
WHERE '1985-05-27'::date
BETWEEN to_date(timeline->>'start_time', 'YYYY-MM-DD')
AND to_date(timeline->>'release_time', 'YYYY-MM-DD')
GROUP BY "e"."name"
问题是,当我在pgadmin中运行此查询时,它运行正常并返回我想要的结果。
我被困了几个小时调试这个。知道问题出在哪里?
答案 0 :(得分:0)
首先,它并不像你在所有Raw语句中使用它那样雄辩; - )
尝试使用Carbon类:Carbon::now()->toDateString()
将返回Y-m-d
格式的日期。
对于where子句,如果我正确理解您的查询,您可以使用2 where子句而不是whereBetween与Raw SQL:->where('start_time', '>', $start_time_preprocessed_by_carbon)->where('release_time', '<', $release_time_preprocessed_by_carbon)
你似乎想要计数,这意味着你可以用->count()
而不是->get()
我很乐意向您提供完整的查询,但无法完全解读。但是,这些实现应该会给你一个正确方向的推动!它们将帮助您进一步抽象查询,以便Laravel的内部查询生成器将代码转换为数据库的正确语法!