2010-03-13 11 views
5

Tengo una lista de artículos pedidos, ordenados según el campo int order. Estoy creando una galería en CakePHP 1.2 que tiene un botón anterior y siguiente y estos deben enlazar al elemento anterior y siguiente de acuerdo con su orden, no según su id.CakePHP: buscar vecinos, ordenar en 'nombre' u 'orden'

Para obtener este resultado, he incluido el parámetro 'orden' en la función de búsqueda y lo he completado con 'Item.order'=>'DESC'. Aún así, el resultado es una lista ordenada id.

Mi pregunta es: ¿qué hago mal? Mi controlador:

$this->Item->id = 16;

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

Solución He intentado un enfoque diferente. Mi código ahora hace el trabajo y se ve de la siguiente manera:

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

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

Al establecer el parámetro 'field' al campo será el campo de ordenación, y establecer el parámetro 'value' a la el valor del pedido de su artículo actual obtendrá prev y next.

Respuesta

4

Sí, el problema fue que no incluía el campo de orden en su matriz de campos.

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

A menos que haya modelos relacionados con los nombres de campos en conflicto que no es necesario incluir el prefijo Item. modelo (aunque yo suelo hacer de todos modos para evitar este tipo de errores.) Eres la sintaxis original, funcionaría si se hubiera incluido [Item.]order en "campos"

Finalmente, su solución no es óptima, está haciendo dos consultas SQL cuando no es necesario. y "campo" no es una opción de consulta, que yo sepa, lo que realmente significa que está devolviendo todos los campos de la tabla.

+0

¡Eres un salvavidas! – Bagata

0

Estaba teniendo problemas con esto. Básicamente, tengo una lista de preguntas que deben ordenarse aleatoriamente (una sola vez) por sesión de usuario.

que se ponía a la orden del modelo a algo como esto:

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

Esto funcionó bien para consultas normales, pero encontrar vecinos se ve obstaculizado por la línea 2897 en Modelo.php:

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

Así que para conseguir alrededor de él, me hizo lo siguiente:

  • añadir un campo virtual llamada 'examination_order', y establezca el fin de que:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)'; 
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order' 
    ); 
    
  • En la llamada de búsqueda de vecinos, establezca el 'campo' en 'examination_order', con el valor establecido en el índice como se encontró anteriormente:

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