Php 雄辩-在where子句中计算日期时间差
我试图检查我的数据库中两列的差异是否在给定的年数下,即DATETIME-BIRTHDATE<年 我试过了Php 雄辩-在where子句中计算日期时间差,php,sql,laravel,eloquent,Php,Sql,Laravel,Eloquent,我试图检查我的数据库中两列的差异是否在给定的年数下,即DATETIME-BIRTHDATEwhereRaw 编辑 上面的示例仅适用于mysql数据库。 对于SQLITE,条件应为 '(JulianDay(values.datetime) - JulianDay(students.birth)) / 365.25 < ?' 对于PostgreSQL 'EXTRACT(YEAR from AGE(values.datetime, students.birth)) < ?' 在代码
$result->where(date_diff((strtotime('datetime')-strtotime('student.birth'), '<', $request->search);
和Student.php
在我保存的学生表中:
$table->DateTime('birth');
在值表中,它是:
$table->DateTime('datetime');
$table->unsignedBigInteger('student_id');
$table->foreign('student_id')->references('id')->on('students');
第二次编辑:
感谢@motia,我编辑了我的代码:
$age = $search->age;
这读取了请求中的年龄,工作得非常好。。但是
$result = Value::query()
->whereHas('student', function($q) use($age) {
$q->whereRaw(
'TIMESTAMPDIFF(YEAR, students.birth, values.datetime) < ?', [$age]
);
})
->get();
抛出一个错误,声明:
SQLSTATE[HY000]:一般错误:1没有这样的函数:TIMESTAMPDIFF SQL:select*从存在的值中选择*从学生中选择,其中values.student_id=students.id和TIMESTAMPDIFFYEAR,students.birth,datetime<19
19是我在代码中的age的示例值,在PHP代码中执行条件以过滤表,而不是构建查询并让数据库执行SQL 查询时,应该考虑构建正确的SQL表达式字符串 对于您的情况,您需要的条件表达式不能使用query->where构建,因此您需要使用query->whereRaw 编辑 上面的示例仅适用于mysql数据库。 对于SQLITE,条件应为
'(JulianDay(values.datetime) - JulianDay(students.birth)) / 365.25 < ?'
对于PostgreSQL
'EXTRACT(YEAR from AGE(values.datetime, students.birth)) < ?'
在代码中,您正在执行条件以过滤PHP代码中的表,而不是构建查询并让数据库执行SQL 查询时,应该考虑构建正确的SQL表达式字符串 对于您的情况,您需要的条件表达式不能使用query->where构建,因此您需要使用query->whereRaw 编辑 上面的示例仅适用于mysql数据库。 对于SQLITE,条件应为
'(JulianDay(values.datetime) - JulianDay(students.birth)) / 365.25 < ?'
对于PostgreSQL
'EXTRACT(YEAR from AGE(values.datetime, students.birth)) < ?'
嗨,你能告诉我你的模型之间的关系吗?你是如何把它们联系起来的?我将帮助您使代码尽可能干净。@motia您好,谢谢!我从模型中添加了关系信息,还有什么有用的吗?嗨,你能告诉我你的模型之间的关系吗?你如何在它们之间建立连接?我将帮助您使代码尽可能干净。@motia您好,谢谢!我从模型中添加了关系信息,还有什么有用的吗?谢谢!我以前从未使用过Model::query,所以我对它的工作原理感到困惑——也没有找到文档。。这个查询现在对我来说似乎是合乎逻辑的,但是我如何执行它呢?对于Eloquent和SQL来说是新手,所以如果这是显而易见的,我很抱歉Model::query中的查询是可选的。如果你不把它说出来,雄辩的人会含蓄地说出来。它应该和你的代码一样。你可以通过再次调用->GetHanks来获得结果!我似乎还是做错了什么。。。我更新了这个问题,如果你能再帮我一次,那就太酷了@Felix,你的数据库没有TIMESTAMPDIFF函数。你在用什么数据库?谢谢!我以前从未使用过Model::query,所以我对它的工作原理感到困惑——也没有找到文档。。这个查询现在对我来说似乎是合乎逻辑的,但是我如何执行它呢?对于Eloquent和SQL来说是新手,所以如果这是显而易见的,我很抱歉Model::query中的查询是可选的。如果你不把它说出来,雄辩的人会含蓄地说出来。它应该和你的代码一样。你可以通过再次调用->GetHanks来获得结果!我似乎还是做错了什么。。。我更新了这个问题,如果你能再帮我一次,那就太酷了@Felix,你的数据库没有TIMESTAMPDIFF函数。你在使用什么数据库?
'EXTRACT(YEAR from AGE(values.datetime, students.birth)) < ?'