【问题标题】:Using CodeIgniter get_where to chain 'and' and 'or' statements使用 CodeIgniter get_where 链接 'and' 和 'or' 语句
【发布时间】:2017-02-27 16:03:09
【问题描述】:

我正在尝试访问本地数据库(在我的 vm 上)中的数据,我必须使用 CodeIgniter 的查询构建类来获取数据。我有这个查询,我在 sql 中找到了:

select message, created
from logs
where username = 'user'
    and (
        created > '1487695796'
        and created < '1487782196'
        )
    and (
        message = 'login failure'
        or message = 'login success'
        or message = 'log out'
        )
order by created asc

我最大的问题是如何在 CodeIgniter 的 get_where 语句中链接 'and's 和 'or's?我已经看过并看到我可以将东西放在一个数组中以用于“WHERE”部分,但我还没有看到如何将东西放入“或”(因为数组中的所有内容都是“和”。我必须使用get_where(不能做'get->where'),所以如果有办法做到这一点,请告诉我!

感谢您花时间阅读我的问题!

【问题讨论】:

  • 哪个版本的 Codeigniter? CI 3.x?,如果是这样,请阅读:codeigniter.com/user_guide/database/…
  • 太棒了,我想我在文档中错过了。我可能无法使用 get_where,但将其分解为 where()->get()
  • 我添加了一个使用查询分组生成原始 sql 字符串的示例

标签: php mysql codeigniter


【解决方案1】:

从 Codeigniter 3.0 开始,查询生成器类支持Query grouping

来自文档:

$this->db->select('*')->from('my_table')
        ->group_start()
                ->where('a', 'a')
                ->or_group_start()
                        ->where('b', 'b')
                        ->where('c', 'c')
                ->group_end()
        ->group_end()
        ->where('d', 'd')
->get();

// Generates:
// SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'

编辑: 在您的示例中,您将使用:

$this->db->select('message, created')->from('logs')
        ->where('username', 'user')
        ->group_start()
                ->where('created >', '1487695796')
                ->where('created <', '1487782196')
        ->group_end()
        ->group_start()
                ->where('message', 'login failure')
                ->or_where('message', 'login success')
                ->or_where('message', 'log out')
        ->group_end()               
        ->order_by('created', 'ASC')  
->get(); 

$this->db->select('message, created')
        ->group_start()
                ->where('created >', '1487695796')
                ->where('created <', '1487782196')
        ->group_end()
        ->group_start()
                ->where('message', 'login failure')
                ->or_where('message', 'login success')
                ->or_where('message', 'log out')
        ->group_end()               
        ->order_by('created', 'ASC')  
->get_where('logs', array('username' => 'user') );

// both generate:
//SELECT `message`, `created` 
//FROM `logs` 
//WHERE `username` = 'user' 
//AND ( `created` > '1487695796' AND `created` < '1487782196' ) 
//AND ( `message` = 'login failure' OR `message` = 'login success' OR `message` = 'log out' ) 
//ORDER BY `created` ASC

要检查 Codeigniter 生成的查询是否与您的 SQL 匹配,您可以使用:

echo $this->db->last_query(); // echos last query string

【讨论】:

    【解决方案2】:

    请试试这个

    $q=$this->db
                 ->select('message,created')
                 ->where('username','user')
                 ->where('created >','1487695796')
                 ->where('created <','1487782196')
                 ->where('message','login failure')
                 ->or_where('message','login success')
                 ->or_where('message','log out')
                 ->order_by('created, ASC')
                 ->get('logs');
          return $q->result();
    

    【讨论】:

    • 这不会在where子句中创建组,没有括号()生成
    【解决方案3】:
    $this->db->select('message, created');
    $this->db->where(['username' => '\'user\'', 'created >' => '1487695796', 'created <' => '1487782196']);
    $this->db->where("(message='login failure' OR message='login success' OR message='log out')", NULL, FALSE);
    $this->db->order_by('created', 'ASC');
    $query = $this->db->get('logs');
    return $query->result();
    

    【讨论】:

    • @Azotherian My Bad....用户是 MYSQL 中的关键字...现在我更新了我的答案...。请检查
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2012-10-10
    • 2019-09-02
    • 2017-03-21
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多