2010-08-14 5 views
2

Dans les actions de modules, quelle est la meilleure façon de sélectionner des enregistrements basés sur un index autre que l'ID de clé primaire?question de requête symfony

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

Cela renvoie toujours une requête avec WHERE City.id= instead of WHERE City.city=

Dois-je faire quelque chose comme

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

Répondre

4

La méthode find() trouve uniquement un enregistrement par une clé primaire.

Vous pouvez trouver des enregistrements par d'autres champs avec des méthodes findBy */findOneBy * comme @phidah mentionné (donc c'est findOneByCity dans votre cas). Cependant, vous ne devriez pas utiliser les méthodes finder dans votre code final. De la documentation de la doctrine:

Ce sont des trouveurs magiques très limités et il est toujours recommandé d'étendre vos requêtes à des requêtes DQL écrites manuellement. Ces méthodes sont conçues pour accéder rapidement à des enregistrements uniques, sans relation, et sont bonnes pour le prototypage de code rapidement.

En savoir plus sur la magie ici trouveurs: http://www.doctrine-project.org/documentation/manual/1_2/nl/dql-doctrine-query-language:magic-finders

je préfère mettre un court appel à une méthode de modèle dans votre action.

Action:

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

Modèle:

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

Tant que vous donnez le nom approprié à votre méthode, qui montre son intention, votre code est beaucoup plus lisible.

+0

il est plus lisible. merci beaucoup pour la direction –

4

Pourquoi ne pas utiliser les méthodes magiques?

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

Une bonne pratique est de l'envelopper dans un chèque comme celui-ci:

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

Cela devrait être fait dans votre action.

Était-ce ce que vous vouliez dire?