2013-07-13 30 views
1

我是新來學習和了解Hydration如何工作,只是想先指出。我目前能夠保存選擇並插入查詢,沒有任何問題。保溼數據庫

我目前被困在嘗試水合物更新查詢現在。在我的實體中,我爲數據庫中的每種類型的列設置了get/set選項。我發現ObjectProperty()Hydrator也適用於我的情況。

但是,每當我嘗試更新只有一定數量的列和提取通過hydrator我收到錯誤,因爲所有其他選項都沒有設置,並返回空值。我不需要更新特定行的所有內容,只需要幾列。

舉例來說,在我的數據庫表我可能有:

  • PHONE_NUMBER
  • EMAIL_ADDRESS

但我只需要更新PHONE_NUMBER。

$entity_passport = $this->getEntityPassport(); 
$entity_passport->setPrimaryPhone('5551239876'); 

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => '1' 
)); 

因爲的setName()和setEmailAddress()不包括在此更新和查詢返回的值不能爲null這將返回一個錯誤。但很明顯,當您查看數據庫表時,數據已經存在。那裏的數據也不需要改變,只有在這個例子中使用PrimaryPhone()號碼。

我一直在尋找和閱讀所有地方的文檔,但我找不到任何可以解釋我做錯了什麼。我應該注意到我只使用Zend \ Db(Not Doctrine)。

我假設我錯過了某個地方,因爲我對這個新功能缺乏知識,我試圖去理解。

也許你不水合更新查詢...我有點迷路/困惑。任何幫助,將不勝感激。謝謝!

回答

3

我認爲你對水合作用存在根本的誤解。水化器只是從數據(水合物)中填充實體對象並從實體對象(提取)中提取數據。所以對於不同類型的查詢沒有單獨的水化器。

在更新示例中,您應該先檢索完整的實體對象($ entity_passport),然後將其傳遞給TableGateway的更新方法。您將通過employeeid檢索實體,因爲這是您用來更新的條件。所以像這樣:

$entity_passport = $passportMapper->findByEmployeeId(1); 
$entity_passport->setPrimaryPhone('5551239876'); 

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => $entity_passport->getId() 
)); 

這假設你有某種映射器層。否則,你可以使用你的護照TableGateway(我認爲這就是getTablePassport()返回的結果,不是?)。

否則,如果你想獲取的對象是開銷太大,你只是想運行查詢,你可以只使用一個\ Zend的\ DB \ SQL \ SQL對象,即:

$sql = new \Zend\Db\Sql\Sql($dbAdapter); 
$update = $sql->update('passport') 
->set(array('primary_phone' => $entity_passport->getPrimaryPhone())) 
->where(array('employeeid' => $employeeId)); 

編輯: 也許這是一個錯誤的調出映射器,因爲它可能會導致更多的混淆。你可以簡單地使用你的TableGateway檢索實體對象,然後滋潤返回行:

$rows = $this->getTablePassport()->select(array('employeeid' => 1)); 
$entity_passport = $this->getHydrator($rows->current()); 
[...] 

編輯2: 我檢查你的要點,我發現了一些東西,所以在這裏我們去:

我看到你的getTablePassport確實會返回一個TableGateway子類的對象。您已經爲此設置了該課程以使用HydratingResultset。這意味着您在使用網關檢索對象時不需要進行任何手動保溼。 您也已經在同一個類中實現了一個Search方法,那麼爲什麼不使用它?不過,我會改變這種方法,因爲現在你正在爲每一列使用LIKE。它不僅效率很低,而且還會給你錯誤的結果,例如在id列上。

如果要解決這個問題的方法,那麼你可以簡單地調用它的服務對象: $this->getTablePassport->Search(array('employeeid' => 1));

否則,你可能只需要實現在tablegateway類單獨的方法,如

public function findByEmployeeId($employeeId) 
{ 
    return $tableGateway->select(array('employeeid' => $employeeId)); 
} 

這應該已經返回一組實體(或者在這個特定情況下)。附:確保在檢索實體時調試並檢查實際返回的內容。因此,在嘗試更新之前,print_r您從PassportTable返回的實體。您首先必須確保檢索代碼正常運行。

+0

是的,這對我來說還是很新的,所以我處於困惑的狀態。你的回答確實有幫助。但如果你能幫我一個忙,並告訴我什麼$ passportMapper-> findByEmployeeId(1);看起來像這將是非常有益的。我認爲這是TableGateway中的一項功能,它可以做一些選擇? – Diemuzi

+0

請參閱上面答案中的編輯。希望這可以幫助。 – Ruben

+0

太近了!也許這將有助於更多https://gist.github.com/diemuzi/5992149 這是我的護照實體,護照表和我試圖做的更新的GIST。當我運行這個時,我不再收到任何錯誤,我可以看到更新查詢正在工作,除了它將SecondaryPhone設置爲空。所以我必須錯過這裏的最後一點。也許你可以看到我沒有的東西。如果我做''$ this-> getHydrator($ result) - > extract($ entity)'''然後我看到SecondaryPhone被設置了,但其他的都是NULL。 – Diemuzi