2012-05-23 37 views
0

可能重複:
How do I add a limit to update-query in Zend Framework?更新與限制Zend框架

我願做一個更新和地點限制1作爲預防措施。 這裏是我的代碼:

$vals = array(); 
$vals['status'] = 'closed'; 
$where = $write->quoteInto('id =?', $orderID); 

$write->update("order", $vals ,$where); 

我在哪裏可以添加一個LIMIT這個查詢?

(貌似已經過去問,但我希望有人在那裏有答案)

+0

Thanks max。從09年開始,這是一個問題嗎?這是一個非常常見的編程實踐,必須有一種方法來做到這一點。 –

+1

我可以明白爲什麼你認爲這可能是「更安全」,但是如果你真的擔心你的where子句不是唯一標識一條記錄,你應該在更新和報告錯誤條件之前實際檢查數據,而不是留下破損,數據庫中的數據不一致。如果你不能相信你的主鍵是獨一無二的,你就會遇到比意外更新多個表更大的問題。 –

+0

是的肖恩真的是事實,而這在邏輯失敗的情況下更是一個限制性的災難,但實際上是不必要的。 –

回答

1

它看起來像你使用到Zend_Db_Adapter會執行您的查詢,所以我不知道你可以做我做什麼,反正在這裏不用。
我通常使用Zend_Db_Table_Row save()方法插入和更新記錄,但是我也使用DbTable模型來提供對Table和Table_Row抽象api的訪問。

public function save(Music_Model_Artist $artist) { 
     //if id is not null 
     if (!is_null($artist->id)) { 
      //find row, uses fetchRow() so will return NULL if not found 
      $row = $this->findById($artist->id); 
      $row->id = $artist->id; 
     } else { 
      //if ID is null create new row 
      $row = $this->_getGateway()->createRow(); 
     } 
     //assign data to row 
     $row->name = $artist->name; 
     //save new row or update 
     $row->save(); 
     //return the row, in case I need it for something else 
     return $row; 
    } 

什麼這相當於是,如果我包括與所述數據陣列中的ID(或在這種情況下的實體對象)的行將被更新,並且如果沒有ID的對象的新行會創建。

如果你好奇,這裏就是我__construct類:

public function __construct(Zend_Db_Table_Abstract $tableGateway = NULL) { 
     //pass in concrete DbTable Model, parent alts to using table name string to construct class 
     $this->_tableGateway = new Application_Model_DbTable_Artist(); 
     parent::__construct($tableGateway); 
    } 

希望這提供了一些幫助。

+0

爲了說清楚,'Zend_Db_Table_Row'也不使用'LIMIT'。正確的答案應該是「**否,沒有辦法在Zend **中包含LIMIT'」。相反,'Zend_Db_Table_Row'使用PRIMARY鍵來確保只有一行被更新._ –

1

嗯...我的Zend是生鏽,但我認爲我已經使用了過去:使用http://framework.zend.com/manual/en/zend.db.statement.html執行SQL(選擇/插入/更新)作爲正常的SQL語句...

但是,所有舊的和當前的信息是正確的 - 更新()沒有能力放置'限制' - 你只需要希望你設計數據庫正確和這樣的表將不會有重複的鍵! 「訂單」是一個真正糟糕的表名:),其中'訂單'是MySQL中的保留字(確實是任何數據庫!)。

+0

關於「訂單」的好處我只是把它作爲示例代碼,但很好的抓住:) –

0

好吧,它看起來像沒有辦法做到這一點,我只是決定使用straingt查詢功能。我仍然使用構建的功能來從WHERE中刪除任何有趣的不需要的值。

$where = $write->quoteInto('id =?', $order_id); 
$write->query("UPDATE orders SET status = 'closed' WHERE $where LIMIT 1");