2015-12-02 1 views
3

Je suis en train de faire une requête avec une coutume « commande par » Propel 1,6Propel ORM: Commander par domaine

select * from myObject ORDER BY FIELD(id, 3, 11, 7, 1) 

cela ne fonctionne pas:

myObjectQuery::create() 
    ->orderById($someIds) 
    ->find() 

Comment puis-je faire ?

+0

Vous pouvez l'ajouter vous-même? https://yogeshsalvi.wordpress.com/2010/01/12/steps-to-implement-mysql-order-by-field-in-symfony-propel/ – HansP

+0

merci pour votre aide, mais c'est une solution de gestion des critères à l'ancienne , je cherche une solution plus générique et moderne. – Lionel

Répondre

0

vous pouvez commander la pile par ce afin que vous voulez:

myObjectQuery::create() 
    ->orderByField1 
    ->orderbyField3('desc') 
    ->orderbyField2 
    ->find() 

essayer.

Mise à jour 2:

$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(); 

dans votre cas, j'établirait con $, créez une requête pour obtenir votre liste de valeurs, puis utiliser une boucle pour affecter votre $stmt->bindValue(#,#) puis exécuter.

+0

J'essaie de faire une commandePar la même zone, en fonction des valeurs de champs: votre solution est pour un ordre classiquePar différents champs. – Lionel

+0

essayez la mise à jour 2. Peut-être que vous obtiendrez ce que vous voulez. – arcee123

+0

merci, c'est sûr que ça marche, c'est du pur SQL, mais je cherchais un chemin Propel pur. – Lionel

0
$ids = array(3, 11, 7, 1); 

$cids = implode(',', $ids); 

myObjectQuery::create() 
    ->orderBy("FIELD(id, {$cids})") 
    ->find()