вопрос о symfony - PullRequest
       3

вопрос о symfony

2 голосов
/ 14 августа 2010

В действиях модулей, каков наилучший способ выбора записей на основе индекса, отличного от идентификатора первичного ключа?

$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 ]

4 голосов
/ 14 августа 2010

Метод find () находит запись только по первичному ключу.

Вы можете найти записи по другим полям с помощью методов findBy * / findOneBy *, как упомянуто @phidah (так что в вашем случае это findOneByCity).

Однако в конечном коде не следует использовать методы поиска. Из документации доктрины:

Это очень ограниченные магические искатели, и всегда рекомендуется расширять ваши запросы, чтобы они были написаны вручную DQL-запросами. Эти методы предназначены только для быстрого доступа к отдельным записям, без связей и хороши для быстрого прототипирования кода.

Подробнее о магических поисках читайте здесь: http://www.doctrine -project.org / documents / 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();
}

Пока вы даете соответствующее имя своему методу, который показывает его намерения, ваш код будет гораздо более читабельным.

4 голосов
/ 14 августа 2010

Почему бы просто не использовать магические методы?

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

Хорошей практикой является завернуть его в чек следующим образом:

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

Это должно быть сделано в вашем действии.

Ты это имел ввиду?

...