Domanda

Ho una lista di articoli ordinati, ordinati secondo il order campo int. Sto creando una galleria in CakePHP 1.2 che ha un prev e il pulsante successivo e quelli dovrebbe collegare alla voce precedente e successivo in base al loro ordinamento, non in base alla loro id.

Al fine di ottenere questo risultato ho incluso il parametro di 'ordine' per la funzione Trova, e popolata con 'Item.order'=>'DESC'. Ancora il risultato è una lista ordinata id.

La mia domanda è: che cosa ho fatto di sbagliato? Il mio controller:

$this->Item->id = 16;

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

La mia soluzione

Ho provato un approccio diverso. Il mio codice ora fa il lavoro e appare come segue:

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

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

Con l'impostazione del parametro 'field' al campo sarà il campo ordinazione, e impostare il parametro 'value' al valore dell'ordine di voi voce corrente si otterrà il prev e next.

È stato utile?

Soluzione

Si il problema era che non eri anche nel settore ordine nel tuo array di campi.

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

A meno che non si è connessi modelli con i nomi dei campi in conflitto non è necessario includere il prefisso modello Item. (anche se di solito faccio in ogni caso al fine di evitare tali errori.) Sei sintassi originale potrebbe funzionare se si fosse incluso [Item.]order in "campi "

Infine, la soluzione non è ottimale, si sta facendo due query SQL quando non è necessario. e 'campo' non è un'opzione di query per quanto ne sono a conoscenza che significa che in realtà stai tornando tutti i campi della tabella.

Altri suggerimenti

ho avuto problemi con questo. Fondamentalmente ho una lista di domande che hanno bisogno di essere ordinato in modo casuale (una sola volta) per ogni sessione utente.

stavo installando l'ordine del modello a qualcosa di simile:

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

Questo ha funzionato bene per le query normali, ma trovare i vicini è ostacolato dalla linea 2897 in model.php:

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

Quindi, per aggirare l'ostacolo, ho fatto la seguente:

  • Aggiungi un campo virtuale chiamato 'examination_order', e impostare l'ordine di che:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)';
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order'
    );
    
  • Negli trovare vicini chiamano, impostare il 'campo' a 'examination_order', con il valore impostato per l'indice di come si trova in precedenza:

    $neighbors = $this->TestQuestion->find(
        'neighbors',
        array(
            'field' => 'examination_order',
            'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'],
            'conditions' => $conditions
        )
    );
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top