【问题标题】:Codeigniter active record update statement with a join带有连接的 Codeigniter 活动记录更新语句
【发布时间】:2012-03-23 14:38:18
【问题描述】:

这是我试图通过活动记录实现的查询:

UPDATE `Customer_donations` cd 
join Invoices i on i.cd_id = cd.cd_id 
set cd.amount = '4', cd.amount_verified = '1' 
WHERE i.invoice_id =  '13';

这是我对活动记录的尝试:

$data = array('cd.amount'=>$amount, 'cd.amount_verified'=>'1');
$this->db->join('Invoices i', 'i.cd_id = cd.cd_id')
     ->where('i.invoice_id', $invoiceId);


// update the table with the new data
if($this->db->update('Customer_donations cd', $data)) {
  return true;
}

这是实际生成的查询:

UPDATE `Customer_donations` cd 
SET `cd`.`amount` = '1', `cd`.`amount_verified` = '1' 
WHERE `i`.`invoice_id` =  '13'

为什么这个活动记录语句没有应用我的联接子句?

【问题讨论】:

  • 我从未在 Codeigniter 的活动记录中尝试过多链。我总是使用普通模式,而且它总是很有魅力。您还可以测试正常版本的查询并向我们提供反馈。
  • 活动记录中的多链很容易。我一直都这样做。在我的 sql 编辑器中手动运行时,我试图实现的查询工作正常。

标签: php sql codeigniter


【解决方案1】:

下面的解决方案怎么样?有点难看,但它达到了您在问题中的预期。

$invoiceId = 13;
$amount = 4;
$data = array('cd.amount'=>$amount, 'cd.amount_verified'=>'1');

$this->db->where('i.invoice_id', $invoiceId);

$this->db->update('Customer_donations cd join Invoices i on i.cd_id = cd.cd_id', $data);

【讨论】:

  • 是的,我同意。但是如果你有一个非常复杂的查询,我认为让 sql 仍然可读,只需回退到$this->db->query();
  • 我不同意。人类可读!=安全可靠。活动记录防止 sql 注入。
  • @Catfish“人类可读”如果你使用占位符会非常安全。
【解决方案2】:

更简洁,因为 update 接受第三个“where”数组参数:

$invoiceId = 13;
$amount = 4;
$data = array('cd.amount'=>$amount, 'cd.amount_verified'=>'1');
$this->db->update('Customer_donations cd join Invoices i on i.cd_id = cd.cd_id', 
  $data, array('i.invoice_id' => $invoiceId));

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2017-03-31
    • 1970-01-01
    • 2011-05-07
    • 2014-06-22
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多