2011-12-21 119 views
1

我在ZF新的,我想留下來加入名爲國表上country.id = firm_dtl.firm_country左Zend框架中加入

$firmobj->fetchAll($firmobj->select($this)->where("firm_name like '$alpha%'")->order('firm_name')); 

我怎樣才能做到這一點。 我這個代碼嘗試: -

$firmobj->select($this)->joinLeft(array("c"=>"country"), "c.id = firm_dtl.firm_country","c.name")->where("firm_name like '$alpha%'")->order('firm_name'); 
+0

這段代碼無法運作? – 2011-12-21 17:05:36

回答

2

joinLeft函數的第三個參數應該是你想獲取列陣列。

$firmobj->select($this) 
     ->joinLeft(array("c"=>"country"), "c.id = firm_dtl.firm_country", array("c.name")) 
     ->where("firm_name like '$alpha%'") 
     ->order('firm_name'); 

此外,更好的辦法就是使用其中的功能是這樣的:

->where("firm_name like ?", $alpha . "%") 

這種方式是更安全的解決方案。

3

以下是一些可以嘗試讓左連接工作並提高安全性的方法。

我通常在多行建立我的select語句,所以我喜歡把它放在一個變量中。爲了調試,我簡單地註釋掉我不需要的行。

$select = $firmobj->select()->from('country'); 

你要setIntegrityCheck(false),因爲你可能不會改變,並承諾從查詢結果。這裏有一個來自ZF文檔的引用。

Zend_Db_Table_Select主要用於約束和驗證 ,以便它可以強制執行合法SELECT查詢的條件。然而, 可能會存在某些情況下,您需要靈活的 Zend_Db_Table_Row組件,並且不需要可寫或可刪除的 行。對於這種特定的用戶情況,可以通過將一個FALSE值傳遞給setIntegrityCheck()來檢索行或 行集。

$select->setIntegrityCheck(false); 

在這裏你加入。您可以將field1,field2,fieldn替換爲您要在結果中看到的firm_dtl表中的字段。

$select->joinLeft(array('c' => 'country'), 'c.id = firm_dtl.firm_country', array('field1', 'field2', 'fieldn')); 

使用參數替換來避免SQL注入攻擊。

$select->where('firm_name LIKE ?', "$alpha%"); 

最後命令結果並獲取行集。

$select->order('firm_name'); 
$rowSet = $firmobj->fetchAll($select);