我的Active Records查询中间有一个普通的SQL语句。有没有办法在不进行两次独立查询的情况下将此查询“添加”到AR中?如果有人帮助我将其“转换”为Active Records风格,以防它无效,则SQL如下所示。
SELECT birthday
FROM usertable
WHERE STR_TO_DATE(birthday, '%d.%m.%Y')
BETWEEN $minimumDate AND $maximumDate
答案 0 :(得分:1)
你可以这样做:
$this->db
->select('birthday')
->where("STR_TO_DATE(birthday, '%d.%m.%Y') BETWEEN $minimumDate AND $maximumDate")
->get('usertable');
但在这种情况下你必须自己逃避变量。
你可以也这样做:
$this->db
->select('birthday')
->where("STR_TO_DATE(birthday, '%d.%m.%Y') >", $minimumDate)
->where("STR_TO_DATE(birthday, '%d.%m.%Y') <", $maximumDate)
->get('usertable');
这会自动转义where()
的第二个参数,但现在我们运行STR_TO_DATE()
两次并且查询稍微不那么优雅(不使用BETWEEN
)。
Active Record可能很难使用MySQL功能。有时,如果您没有动态构建查询,最好手动执行查询。 CI提供了一些方法,可以轻松地为您提供适当的输入。
请参阅用户指南中有关Query Bindings:
的部分$sql = "SELECT birthday
FROM usertable
WHERE STR_TO_DATE(birthday, '%d.%m.%Y')
BETWEEN ? AND ?";
$this->db->query($sql, array($minimumDate, $maximumDate));
答案 1 :(得分:0)
你可以这样做 -
SELECT birthday
FROM usertable
WHERE STR_TO_DATE(birthday, '%d.%m.%Y')
BETWEEN $minimumDate AND $maximumDate
像这样链接 -
$this->db->select('birthday')->from('usertable')->where('STR_TO_DATE', '%d.%m.%Y')->limit($minimumDate, $maximumDate);