symfony查询问题

时间:2010-08-14 14:06:57

标签: php symfony1 doctrine

在模块操作中,根据主键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();

2 个答案:

答案 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();
}

只要您为显示其意图的方法指定适当的名称,您的代码就更具可读性。