Question

J'ai une table où il y a une colonne dans laquelle différentes valeurs sont stored.i veulent récupérer les valeurs uniques de cette table à l'aide dql.

         Doctrine_Query::create()
                    ->select('rec.school')
                    ->from('Records rec')                   
                    ->where("rec.city='$city' ")                                    
                    ->execute();        

Maintenant, je veux que des valeurs uniques. Quelqu'un peut-il me dire comment faire ...

Modifier

Tableau Structure:

CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `school` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16334 ;

Ceci est la requête que je suis en utilisant:

   Doctrine_Query::create()
          ->select('DISTINCT rec.city')
          ->from('Records rec')                   
          ->where("rec.state = '$state'")                                    
             // ->getSql();
           ->execute();                 

Generting Sql pour cela me donne:

SELECT DISTINCT r.id AS r__id, r.city AS r__city FROM records r WHERE r.state = 'AR'

Vérifiez maintenant le SQL généré ::::    DISTINCT est sur la colonne 'id' où que je veux Distinct sur la colonne de la ville. Quelqu'un sait comment résoudre ce problème.

EDIT2

Id est unique cause de son un value.Ya supplémentaire de l'automobile j'ai des doublons réels dans la colonne de ville comme: Delhi et Delhi. Droit .. Maintenant, quand je suis en train de récupérer des données à partir, je reçois Delhi deux fois. Comment puis-je faire requête comme ceci:

  select DISTINCT rec.city where state="xyz";

Parce que cela me donnera la sortie appropriée.

EDIT3:

Toute personne qui peut me dire comment comprendre cette requête .. ???

Était-ce utile?

La solution

dépend de la version que vous utilisez, mais j'eu le même problème et -.> Distincte () a fonctionné pour moi

Doctrine_Query::create()
      ->select('rec.city')->distinct()
      ->from('Records rec')                   
      ->where("rec.state = '$state'")                                    
       ->execute();     

Autres conseils

Pouvez-vous utiliser GROUP BY?

Doctrine_Query::create()
    ->select('rec.school')
    ->from('Records rec')                   
    ->where("rec.city='$city' ")                                    
    ->groupBy('rec.school')   
    ->execute();

Il n'y a pas besoin de RawSql
Au lieu de -> sélectionnez ( 'rec.city DISTINCT')
Utilisez -> select ( 'DISTINCT (rec.city) comme ville)

Vous pouvez utiliser le Raw_Sql classe pour y parvenir. Voici un test que je viens de faire sur ma propre base de données:

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'library');

require('Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

Doctrine::loadModels('application/models/generated');
Doctrine::loadModels('application/models');

$dm=Doctrine_Manager::getInstance();
$conn = $dm->openConnection("mysql://dbuser:dbpass@localhost/database");  //changed actual values...
$q = new Doctrine_RawSql($conn);

$q->select('{c.name}')
   ->distinct()
   ->from('contactlist c')
   ->addComponent('c', 'Contactlist');

//this outputs:  SELECT DISTINCT c.name AS c__name FROM contactlist c
echo $q->getSqlQuery() . "<br>\n"; 

$contacts = $q->execute();
foreach($contacts->toArray() as $contact){
    echo $contact['name'] . "<br>\n";
}

?>

DISTINCT est une fonction d'agrégation. En tant que telle doctrine ne peut hydrater votre résultat en objets. Utilisez une stratégie d'hydratation différente, comme Bartman a suggéré.

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

a bien fonctionné pour moi

La doctrine de la raison est toujours d'ajouter la clé primaire à la liste des champs se trouve à l'intérieur du Hydratation. Lorsque Doctrine va chercher les lignes de la base de données, il hydrate (= convertit) les dans une hiérarchie d'objets et références les objets de modèle à l'aide de la clé primaire. Dans votre cas, ce comportement est voulu, puisque seulement les noms de ville sont d'intérêt.

Je suggère deux solutions, malheureusement je ne peux pas les tester en ce moment.

  1. Essayez d'utiliser Doctrine_RawSql . RawSql a un traitement spécial pour les requêtes DISTINCTS.

$q = Doctrine_RawSql::create()
->select('DISTINCT {rec.city}')
->from('Records rec')
->where('rec.state = ?', $state) ->addComponent('rec', 'Record');

$cities = $q->execute()

  1. Utilisez un objet non-hiérarchie basée Hydrator. Cela peut garder la doctrine de la récupération de la clé primaire pour initialiser la classe de modèle. Consultez la documentation (ne peut pas poster le lien -.. Nouvel utilisateur désolé). Pour plus d'informations

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->where("rec.state = ?", $state);

$cities = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

$ villes doivent contenir un tableau de tableaux avec des clés comme « rec_city ».

S'il vous plaît noter l'utilisation de l'espace réservé ? dans les états où, il est bon de laisser faire la doctrine échapper et non la lutte avec vous-même.

$query = $this->getEntityManager()->createQueryBuilder()
                    ->select('DISTINCT(p.document)')
                    ->from('Products', 'p');

Celui-ci fonctionne pour moi.

Re-réponse :

case est cochée sur mon ordinateur local - ne fonctionnait pas. Alors, laissez-moi des conseils d'utiliser PDO tant que ce sera renforcée ou fixé:

$dbh = Doctrine_Manager::connection()->getDbh();
$stmt = $dbh->prepare('SELECT DISTINCT(rec.city) FROM <tablename> WHERE rec.state = :state');
$stmt->bindParam(':state', $state);
$stmt->execute();
$result = $stmt->fetchAll();

Conseil Je vous recommande d'utiliser clé étrangère fait référence à la liste des villes sur colonne city au lieu de plaine texte pour une flexibilité et une meilleure performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top