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.
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
En avez-vous besoin pour Propel 1.5 ou moins? – Jan