CakePHP 2.1 - Comment utiliser correctement DISTINCTES dans find()
J'ai une question qui me rend fou et je dois admettre que je ne suis pas du tout expérimenté dans CakePHP. Comme mentionné dans la présente question,
À l'aide DISTINCTES dans CakePHP trouver la fonction, à l'aide DISTINCTES de cette façon:
$this->Model->find('all', array('fields'=>'DISTINCT field_name'));
ne retourne pas de valeurs DISTINCTES, au lieu de cela, il renvoie toutes les lignes. En fait, l'DISTINCTES ici est complètement inutile, parce que, pour une raison quelconque , CakePHP ajoute TableName
.id
dans la requête SQL (pourquoi?? puis-je supprimer la référence id??), effectivement le retour chaque DISTINCTES de la clé primaire (=tous les rangs=inutile).
Donc, j'ai encore envie de retourner les valeurs DISTINCTES d'une field_name colonne. Je ne peux pas le faire en utilisant simplement la find('all') ou find('list') de la fonction? Est-ce vraiment la bonne façon de le faire à l'aide de ce Set::extract() la fonction décrite dans le lien ci-dessus? Qui semble être un trop indirecte solution par CakePHP, normalement Gâteau de rendre ma vie plus facile. 🙂 Quelle est la bonne façon d'utiliser les trouver et DISTINCTES ensemble? Peut-être DISTINCTES ne fonctionne pas pour find()?
En regardant le livre, ils disent: "Un exemple rapide de faire une requête DISTINCT. Vous pouvez utiliser d'autres opérateurs, tels que MIN(), MAX(), etc., d'une manière analogue:"
<?php
array(
'fields' => array('DISTINCT (User.name) AS my_column_name'),
'order' = >array('User.id DESC')
)
?>
Source: http://book.cakephp.org/2.0/en/models/retrieving-your-data.html
Cela indique que DISTINCTE devrait être possible de l'utiliser, mais qu'est-ce ici? N' (De L'Utilisateur.nom) correspondent à la field_name je veux DISTINCTES pour ou est my_column_name mon field_name?
Enfin, tout cela a changé lors de la migration de CakePHP 1.x CakePHP 2.x? C'est à dire sont les réponses pour CakePHP 1.x vu sur Stackoverflow-elle toujours pertinente?
Merci d'avance!
OriginalL'auteur alieninlondon | 2012-06-23
Vous devez vous connecter pour publier un commentaire.
Oui, le deuxième extrait est la façon correcte de faire un
SELECT DISTINCT
dans CakePHP 2.x.User.name
correspond au nom du champ, dans ce cas, le champname
dans leusers
table.my_column_name
est un (option) alias pour le nom du champ dans le jeu de résultats, c'est à dire au lieu dename
le champ sera nommémy_column_name
dans le jeu de résultats.$regions = $this->Provider->find('all', array ('fields' => array('DISTINCT (provider.region) AS region')));
ou$regions = $this->Provider->find('all', array ('fields' => array('DISTINCT (provider.region)')));
il ne ramasse pas les entrées uniques. Au lieu de toutes les lignes ce qui n'est pas DISTINCT et non ce que je voulais. L'résultant de la requête SQL:SELECT DISTINCT (
fournisseur de.
région),
Fournisseur de.
id " DEcarecrowd
.providers
COMMEProvider
OÙ 1 = 1`. Je n'ai missunderstand vous en quelque sorte et mon code incorrect?Le SQL généré la requête est incorrecte, il ne devrait pas être
Provider.id
dans la requête. Qui CakePHP version utilisez-vous? Et quelle base de données? Au moins avec CakePHP 2.1.3 et MySQL le bon requête est générée.Merci pour la réponse. J'ai CakePHP 2.1.3 et MySQL. Donc ce n'était pas la question. Cependant, votre réponse m'a fait penser à d'autres choses que défectueux de la syntaxe, mais en rapport avec le modèle. Il s'avère que le problème était que j'avais établi un modèle de l'association pour le modèle de Fournisseur, sans le modèle de l'association de la syntaxe ci-dessus fonctionne très bien. Donc, Gâteau ajouté le
Provider.id
automatiquement à la requête SQL, est-il censé être de cette façon, ou est-ce un bug? Je demande depuis le modèle de l'association efficacement les blocs DISTINCTS requête de la recherche pour le modèle en question. Ou peut-être que j'ai raté quelque chose?Oui, CakePHP récupère automatiquement les données à partir des modèles associés. Pour éviter cela, vous devez spécifier
'recursive' => -1
dans le tableau d'options pour le trouver (ou utiliser le behavior Containable comportement).C'est en montrant d'abord sur Google pour les recherches, ce problème donc je voulais juste ajouter quelque chose pour aider les autres: Si vous êtes en train de faire un find('list'), alors le Gâteau sera de garder le Modèle.id même si vous utilisez recursive = -1. Une autre façon de supprimer les doublons dans Cake est suggéré dans le stackoverflow.com/a/1718614/794458
OriginalL'auteur dhofstet
La façon correcte d'utiliser distinctes en trouver, avec la condition est:
où $val contient une valeur qui vous voulez passer de la requête.
Ont un Beau jour
OriginalL'auteur
Pour
CakePHP 3.X
De sélectionner des champs, vous pouvez utiliser le
distinct()
méthode:CookBook Documentation
OriginalL'auteur Faisal