2010-08-14 109 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')); 

这应该在你的行动来完成。

那是你的意思吗?