2011-02-04 6 views
0

Je donne les résultats suivants en mySQL:symfony - mysql aux critères()

SELECT t.tag, COUNT(*) AS `count` 
FROM tag t, content_item_tag c 
WHERE t.id = c.tag_id 
GROUP BY t.id, c.tag_id 
ORDER BY count DESC 
LIMIT 0 , 30 

que quelqu'un peut me aider à convertir ce à une requête de critères() Propel?

Merci

+0

Je pense que vous devriez utiliser une requête personnalisée à la place, pas les critères Propel. Exemple: http://stereointeractive.com/blog/2007/06/12/propel-queries-using-custom-sql-peer-classes-and-criterion-objects/ – Aston

+0

En avez-vous besoin pour Propel 1.5 ou moins? – Jan

Répondre

4

Voir la dernière entrée sur le blog de Propel: How Can I Write This Query Using An ORM? Voici une citation de là:

Réponse # 1: Vous n'avez pas besoin d'un ORM

Un récent post sur le propulseront utilisateurs liste d'envoi demandé la version Propel de la requête suivante:

SELECT COUNT(t1.user) AS users, t1.choice AS lft, t2.choice AS rgt 
FROM Choices t1 iNNER JOIN Choices t2 ON (t1.user = t2.user) 
WHERE t1.choice IN (...) AND t2.choice IN (...) 
GROUP BY t1.choice, t2.choice; 

Cette requête est pas orienté objet, il est purement relationnel, il n'a donc pas besoin d'un mappage objet-relationnel. La meilleure façon d'exécuter cette requête dans un ORM est de sauter l'ORM et utiliser PDO directement:

<?php 
$con = Propel::getConnection(); 
$query = 'SELECT COUNT(t1.user) AS users, t1.choice AS lft, t2.choice AS rgt 
    FROM choice t1 iNNER JOIN choice t2 ON (t1.user = t2.user) 
    WHERE t1.choice IN (?, ?) AND t2.choice IN (?, ?) 
    GROUP BY t1.choice, t2.choice'; 
$stmt = $con->prepare($query); 
$stmt->bindValue(1, 'foo'); 
$stmt->bindValue(2, 'bar'); 
$stmt->bindValue(3, 'baz'); 
$stmt->bindValue(4, 'foz'); 
$res = $stmt->execute(); 

Conseils d'une requête purement relationnelle sont:

  • La partie SELECT cerise prend des colonnes la table principale
  • les données de sélectionner une partie des agrégats de plusieurs tables
  • les colonnes sélectionnées utilisent des fonctions SQL spécifiques au fournisseur
  • la requête joint tables à travers des colonnes qui n » t partager une clé
  • étrangère La requête est longue et fait plusieurs jointures
  • La requête utilise GROUP BY ou HAVING
  • Les messages de l'utilisateur de la requête, mais n'a aucune idée du modèle d'objet correspondant

C'est la réponse la plus courante à la question "Comment puis-je écrire ...". Ce n'est pas une mauvaise chose de recourir à une requête de base de données directe dans un projet en utilisant un ORM quand c'est l'outil approprié pour le travail. Si Propel rend le code beaucoup plus complexe à écrire, non réutilisable ou douloureusement lent, ne l'utilisez pas. Soyez pragmatique.

+0

Bien que je ne sois pas d'accord avec tous les conseils que vous avez fournis (5 et 6) dans ce cas, je pense que sauter l'ORM est la meilleure idée. – Jan

Questions connexes