Question

I ai une liste d'articles commandés, commandé en fonction du champ d'int order. Je crée une galerie à CakePHP 1.2 qui a un précédent et le bouton suivant et ceux-ci devraient créer un lien vers l'élément précédent et suivant en fonction de leur ordre, et non en fonction de leur id.

Pour obtenir ce résultat, j'ai inclus le paramètre « ordre » à la fonction de recherche, et peuplée avec 'Item.order'=>'DESC'. Pourtant le résultat est une liste ordonnée de id.

Ma question est: qu'est-ce que je fais mal? Mon contrôleur:

$this->Item->id = 16;

$neighbours = $this->Item->find('neighbors', array(
    'order' => array('Item.order'=>'DESC'),
    'fields' => array('id','name')
));

Ma solution

Je l'ai essayé une approche différente. Mon code fait maintenant le travail et se présente comme suit:

$order = $this->Item->findById(6);

$neighbours = $this->Item->find('neighbors', array(
    'field' => 'order',
    'value' => $order['Item']['order']
));

En définissant le paramètre 'field' sur le terrain sera le champ de commande, et définissez le paramètre 'value' à la valeur de l'ordre de vous article actuel, vous aurez la prev et next.

Était-ce utile?

La solution

Ouais le problème est que vous ne avez pas compris le champ de commande dans votre tableau de champs.

$neighbours = $this->Item->find('neighbors', array(
    'order' => 'order DESC',
    'fields' => array('id', 'name', 'order')
));

Sauf si vous avez des modèles liés aux noms de champs contradictoires que vous n'avez pas besoin d'inclure le préfixe modèle Item. (bien que je fais habituellement de toute façon d'éviter de telles erreurs.) Vous êtes syntaxe d'origine fonctionnerait si vous aviez inclus [Item.]order dans « champs «

Enfin, votre solution est pas optimale, vous faites deux requêtes SQL lorsque vous n'avez pas besoin. et « champ » est pas une option de requête pour autant que je sache ce qui signifie en fait vous retournez tous les champs de la table.

Autres conseils

J'avais des problèmes avec cela. Fondamentalement, j'ai une liste de questions qui doivent être commandés au hasard (une seule fois) par session utilisateur.

Je mettais l'ordre du modèle à quelque chose comme ceci:

'FIELD(TestQuestion.id, 3, 1, 5)';

a bien fonctionné pour les requêtes normales, mais trouver des voisins est contrecarrée par la ligne 2897 dans model.php:

$query['order'] = $field . ' DESC';

Donc, pour contourner, je l'ai fait ce qui suit:

  • Ajouter un champ virtuel appelé 'examination_order', et définir l'ordre que:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)';
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order'
    );
    
  • Dans les trouver voisins appellent, définir le « champ » à « examination_order », avec la valeur définie à l'index que l'on trouve précédemment:

    $neighbors = $this->TestQuestion->find(
        'neighbors',
        array(
            'field' => 'examination_order',
            'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'],
            'conditions' => $conditions
        )
    );
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top