2010-08-14 58 views
2

在模塊操作中,根據主鍵ID以外的索引選擇記錄的最佳方式是什麼?symfony查詢問題

$this->city = Doctrine::getTable('City')->find(array($request->getParameter('city'))); 

這總是返回與WHERE City.id= instead of WHERE City.city=

查詢我必須做一些像

$q = Doctrine_Query::create() 
    ->from('City j') 
    ->where('j.city = ?', $request->getParameter('city')); 
    $this->city=$q->execute(); 

回答

4

find()方法只能通過主鍵查找記錄。

你可以通過findBy */findOneBy *方法找到其他字段的記錄,就像@phidah提到的那樣(因此它就是findOneByCity)。

但是,您不應在最終代碼中使用查找器方法。從學說的文檔:

這些是非常有限的魔術發現者,它總是建議擴大您的查詢手動寫入DQL查詢。這些方法僅用於快速訪問單個記錄,無需關係,並且適用於快速構建原型代碼。

瞭解更多關於魔術發現者這裏:http://www.doctrine-project.org/documentation/manual/1_2/nl/dql-doctrine-query-language:magic-finders

我寧願把短調用模型方法在你的行動。

操作:

$this->city = CityTable::getByName($request->getParameter('city')); 

型號:

public static function getByName($cityName) 
{ 
    return Doctrine_Core::getTable('City') 
     ->createQuery('c') 
     ->where('c.city = ?', $cityName) 
     ->fetchOne(); 
} 

只要你到你的方法,這表明其意圖給予適當的名字,你的代碼是更具可讀性。

+0

它更具可讀性。非常感謝你的指導 – 2010-08-14 17:23:27

4

爲什麼不直接用魔術方法?

<?php 
$city = Doctrine::getTable('City')->findOneByCity($request->getParameter('city'); 

一個好的做法是將其包裝在這樣的檢查:

<?php 
$this->forward404Unless($city = Doctrine::getTable('City')->findOneByCity($request->getParameter('city')); 

這應該在你的行動來完成。

那是你的意思嗎?