具有多个 SET 分配和多个 WHERE 条件的 CodeIgniter UPDATE 查询

问题描述 投票:0回答:8

如何将此查询转换为活动记录?

"UPDATE table_user 
 SET email = '$email', last_ip = '$last_ip' 
 where username = '$username' and status = '$status'";

我尝试将上面的查询转换为:

$data = array('email' => $email, 'last_ip' => $ip);
$this->db->where('username',$username);
$this->db->update('table_user',$data);

使用 where 子句状态怎么样?

# must I write db->where two times like this?
$this->db->where('username', $username);
$this->db->where('status', $status);

我也尝试过这个:

$this->db->where('username', $username, 'status', $status);
php codeigniter activerecord sql-update query-builder
8个回答
81
投票

您可以使用数组并传递数组。

Associative array method:
$array = array('name' => $name, 'title' => $title, 'status' => $status);

$this->db->where($array); 

// Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

或者如果您想做=比较以外的事情

$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);

$this->db->where($array);

18
投票

是的,多次调用 where() 是实现此目的的完全有效的方法。

$this->db->where('username',$username);
$this->db->where('status',$status);

http://www.codeigniter.com/user_guide/database/query_builder.html


2
投票

您可以尝试此功能以实现多用途

function ManageData($table_name='',$condition=array(),$udata=array(),$is_insert=false){
$resultArr = array();
$ci = & get_instance();
if($condition && count($condition))
    $ci->db->where($condition);
if($is_insert)
{
    $ci->db->insert($table_name,$udata);
    return 0;
}
else
{
    $ci->db->update($table_name,$udata);
    return 1;
}

}


2
投票

$wherecond = "( ( ( username ='" . $username . "' OR status='" . $status . "') AND (id='" . $id . "') ) )";
        $this->db->where($wherecond);

如果您想一次添加 AND 和 OR 条件。这会起作用。


1
投票

试试这个

$data = array(
               'email' =>$email,
               'last_ip' => $last_ip
            );

$where = array('username ' => $username , 'status ' => $status);
$this->db->where($where);
$this->db->update('table_user ', $data); 

1
投票

这个答案已经晚了,但我认为也许仍然可以提供帮助,我尝试了上面的两种方法,使用两个where条件和带有数组的方法,这些对我来说都不起作用,我做了几次测试,但条件从未被执行,所以我做了一个解决方法,这是我的代码:

public function validateLogin($email, $password){
        $password = md5($password);
        $this->db->select("userID,email,password");
        $query = $this->db->get_where("users", array("email" => $email));
        $p = $query->row_array();

        if($query->num_rows() == 1 && $password == $p['password']){  
            return $query->row();
        }

    }

1
投票

您可以同时使用数组,例如:

$array = array('tlb_account.crid' =>$value , 'tlb_request.sign'=> 'FALSE' );

并直接分配,例如:

$this->db->where('tlb_account.crid' =>$value , 'tlb_request.sign'=> 'FALSE');

我希望能帮助你。


0
投票

最优雅的是,此任务只需一次查询构建器方法调用即可完成,因为 CodeIgniter 的

update()
方法的第三个参数接收 WHERE 子句条件的关联数组。

$this->db->update(
    'table_user',
    ['email' => $email, 'last_ip' => $ip],
    ['username' => $username, 'status' => $status]
);

方法签名基本上是:

function update($table, $set, $where)

我强烈建议执行此操作的模型方法应返回一个由

$this->db->affected_rows()
填充的 int 类型值,以指示目标行实际上以某种方式发生了更改。

© www.soinside.com 2019 - 2024. All rights reserved.