Grouping WHERE clauses in Codeigniter

后端 未结 6 895
陌清茗
陌清茗 2020-11-27 21:02

I want to produce the following SQL code using Active Records in Codeigniter:

WHERE name != \'Joe\' AND (age < 69 OR id > 50)

Doing t

相关标签:
6条回答
  • 2020-11-27 21:24

    Solved. Dynamically generate the SQL query and plug it into $this->db->where(). Thanks guys!

    0 讨论(0)
  • 2020-11-27 21:37

    You can use one large string.

    $this->db->select()->from('users')->where("name != 'Joe' AND (age < 69 OR id > 50) ");

    0 讨论(0)
  • 2020-11-27 21:44

    In Codeigniter 3.0.3 you can do it simple like this :

    $this->db->select()
      ->from('users')
      ->where('name !=', 'Joe')
      ->group_start() // Open bracket
      ->where('age <', 69)
      ->or_where('id <', $id)
      ->group_end(); // Close bracket
    

    Perhaps it can help

    0 讨论(0)
  • 2020-11-27 21:44

    What I've done is duplicate the and clause after the where, which is effectively the same as the long string selection.

    $this->db->select()
      ->from('users')
      ->where('name !=', 'Joe')
      ->where('age <', 69)
      ->or_where('id <', $id)
      ->where('name !=', 'Joe');
    

    The one large string way is probably better.

    0 讨论(0)
  • 2020-11-27 21:48

    The grouping of where clauses is not in CI by default. You have to extend the core and add in the ability. I have done so by doing something as follows:

    class MY_DB_mysql_driver extends CI_DB_mysql_driver 
    {       
        public function __construct($params) 
        {
        parent::__construct($params);
        }
        /** 
         * This function will allow you to do complex group where clauses in to c and (a AND b) or ( d and e)
         * This function is needed as else the where clause will append an automatic AND in front of each where Thus if you wanted to do something
         * like a AND ((b AND c) OR (d AND e)) you won't be able to as the where would insert it as a AND (AND (b...)) which is incorrect. 
         * Usage: start_group_where(key,value)->where(key,value)->close_group_where() or complex queries like
         *        open_bracket()->start_group_where(key,value)->where(key,value)->close_group_where()
         *        ->start_group_where(key,value,'','OR')->close_group_where()->close_bracket() would produce AND ((a AND b) OR (d))
         * @param $key mixed the table columns prefix.columnname
         * @param $value mixed the value of the key
         * @param $escape string any escape as per CI
         * @param $type the TYPE of query. By default it is set to 'AND' 
         * @return db object.  
         */
        function start_group_where($key,$value=NULL,$escape,$type="AND")
        {
            $this->open_bracket($type); 
            return parent::_where($key, $value,'',$escape); 
        }
    
        /**
         * Strictly used to have a consistent close function as the start_group_where. This essentially callse the close_bracket() function. 
         */
        function close_group_where()
        {
            return $this->close_bracket();  
        }
    
        /**
         * Allows to place a simple ( in a query and prepend it with the $type if needed. 
         * @param $type string add a ( to a query and prepend it with type. Default is $type. 
         * @param $return db object. 
         */
        function open_bracket($type="AND")
        {
            $this->ar_where[] = $type . " (";
            return $this;  
        }   
    
        /**
         * Allows to place a simple ) to a query. 
         */
        function close_bracket()
        {
            $this->ar_where[] = ")"; 
            return $this;       
        }
    }
    

    Usage:

    group_where_start(key,value)->where(key,value)->group_where_close() 
    

    or

    complex queries like

    open_bracket()->start_group_where(key,value)->where(key,value)->close_group_where()->start_group_where(key,value,'','OR')->close_group_where()->close_bracket() would produce AND ((a AND b) OR (d))
    
    0 讨论(0)
  • 2020-11-27 21:48

    CI3 has all you need!

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

    https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping

    0 讨论(0)
提交回复
热议问题