在模块操作中,根据主键ID以外的索引选择记录的最佳方法是什么?
$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();
答案 0 :(得分:4)
为什么不使用魔法?
<?php
$city = Doctrine::getTable('City')->findOneByCity($request->getParameter('city');
一个好的做法是将它包装在这样的支票中:
<?php
$this->forward404Unless($city = Doctrine::getTable('City')->findOneByCity($request->getParameter('city'));
这应该在你的行动中完成。
那是你的意思吗?
答案 1 :(得分:4)
find()方法只能通过主键查找记录。
您可以使用findBy * / findOneBy *方法查找其他字段的记录,就像提到@phidah一样(所以在您的情况下它是findOneByCity)。
但是,您不应该在最终代码中使用finder方法。来自学说的文件:
这些是非常有限的魔术搜索器,并且始终建议将查询扩展为手动编写的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();
}
只要您为显示其意图的方法指定适当的名称,您的代码就更具可读性。