2010-03-13 9 views
5

Ich habe eine Liste der bestellten Artikel, geordnet nach dem int-Feld order. Ich erstelle eine Galerie in CakePHP 1.2, die eine vorherige und nächste Schaltfläche hat und diese sollte mit dem vorherigen und nächsten Element gemäß ihrer Bestellung verknüpft werden, nicht gemäß ihrer id.CakePHP: Nachbarn finden, Bestellung auf 'Name' oder 'Bestellung'

Um dieses Ergebnis zu erhalten, habe ich den Parameter 'order' in die Funktion find aufgenommen und mit 'Item.order'=>'DESC' gefüllt. Dennoch ist das Ergebnis eine id geordnete Liste.

Meine Frage ist: Was mache ich falsch? Mein Controller:

$this->Item->id = 16;

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

Lösung ich einen anderen Ansatz versucht haben. Mein Code hat jetzt die Aufgabe und sieht wie folgt aus:

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

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

Durch die Einstellung der Parameter 'field' auf dem Feld wird das Ordnungsfeld sein, und stellen Sie den 'value' Parameter auf die Bestellwert von Ihnen aktuellen Artikel erhalten Sie die prev und next.

Antwort

4

Ja, das Problem war, dass Sie nicht das Auftragsfeld in Ihrem Felder-Array enthalten.

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

Sofern Sie Modelle mit widersprüchlichen Feldnamen im Zusammenhang haben müssen Sie die Item. Modell Präfix nicht enthalten (obwohl ich in der Regel ohnehin tun, um solche Fehler zu vermeiden.) Sie sind Original-Syntax würde funktionieren, wenn Sie enthalten hatte [Item.]order in "Felder"

Schließlich ist Ihre Lösung nicht optimal, Sie machen zwei SQL-Abfragen, wenn Sie nicht benötigen. und "Feld" ist keine Abfrage-Option, soweit ich weiß, was eigentlich bedeutet, dass Sie alle Felder in der Tabelle zurückgeben.

+0

Sie sind ein Lebensretter! – Bagata

0

Ich hatte Probleme damit. Grundsätzlich habe ich eine Liste von Fragen, die nach dem Zufallsprinzip (nur einmal) pro Benutzersitzung bestellt werden müssen.

ich die Ordnung des Modells zu so etwas wie dies einstellen:

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

Dieses für normale Abfragen fein gearbeitet, aber die Suche nach Nachbarn durch die Linie 2897 in Modell stymied wird.php:

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

Also um es zu bekommen, habe ich folgendes:

  • In ein virtuelles Feld namens 'examination_order', und stellen Sie die Reihenfolge zu:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)'; 
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order' 
    ); 
    
  • Setzen Sie im Aufruf von find neighbells das 'Feld' auf 'examination_order', wobei der Wert wie zuvor auf den Index gesetzt wird:

    $neighbors = $this->TestQuestion->find(
        'neighbors', 
        array(
         'field' => 'examination_order', 
         'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'], 
         'conditions' => $conditions 
        ) 
    );