【问题标题】:Using normal SQL with Active Records in Code Igniter在 Codeigniter 中使用带有 Active Record 的普通 SQL
【发布时间】:2011-10-23 14:13:18
【问题描述】:

我的 Active Records 查询中间有一个普通的 SQL 语句。有什么方法可以在没有两个独立查询的情况下将此查询“添加”到 AR 中?如果有人帮我将其“转换”为 Active Records 样式以防它不起作用,则 SQL 如下所示。

SELECT birthday
FROM usertable
WHERE STR_TO_DATE(birthday, '%d.%m.%Y')
BETWEEN $minimumDate AND $maximumDate

【问题讨论】:

    标签: sql database codeigniter


    【解决方案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));
    

    【讨论】:

      【解决方案2】:

      你可以这样做 -

      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);
      

      【讨论】:

      • 这不是 ActiveRecord 的 where() 的工作方式,或者 MySQL 的 BETWEEN 的工作方式。你试过这个吗?它实际创建了什么查询?
      • 好吧,我没用过查询:|我应该在摆姿势之前尝试一下。但这是用户指南中给出的方式
      • where('STR_TO_DATE', '%d.%m.%Y') 部分将是错误的。但我不知道会是什么。
      • 您的示例中的 limit()where() 已关闭。这将产生类似SELECT birthday FROM usertable WHERE STR_TO_DATE = '%d.%m.%Y' LIMIT $minimumDate, $maximumDate
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多