Pregunta

Estoy usando el comportamiento Containable para obtener una lista de comentarios (belongsTo de correos, que pertenece a la pregunta; Pregunta hasMany de correos, y Post Comentarios hasMany; todos ellos pertenecen a los usuarios).

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

Funciona, cuando comento la sección de comentarios anteriores. Supongo que esto es de esperar, pero lo que quiero es todos los mensajes que se encuentran, deben ser ordenados en orden del campo 'creado' del 'Usuario' al que pertenecen. ¿Cómo puedo lograr este nivel más profundo de clasificación en CakePHP? Siempre tengo, "Advertencia (512): Error de SQL: 1054: Desconocido columna 'creada por el usuario' en 'cláusula de orden'"

Gracias por su ayuda!

¿Fue útil?

Solución

Además, es posible que esté intentando grupo en una tabla relacionada desde una llamada hallazgo que no utiliza uniones.

Establecer su nivel de depuración a algo mayor que 1 para que pueda ver el registro de consultas y asegúrese de que la torta no está haciendo dos consultas en busca de sus datos. Si ese es el caso, entonces la primera consulta no es en realidad hace referencia a la segunda tabla.

Si desea forzar manualmente una combinación en estas situaciones se puede utilizar el Ad-Hoc se une método descrito por Nate en el siguiente enlace.

http: / /bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

Otros consejos

He encontrado dos formas de evitar esto. La primera es para definir el segundo Associacion nivel directamente en el modelo. Ahora usted tendrá acceso a estos datos en todas partes. Debe ser algo como esto .....

var $belongsTo = array(
'Foo' => array(
  'className' => 'Foo', //unique name of 1st level join ( Model Name )
  'foreignKey' => 'foo_id', //key to use for join
  'conditions' => '',
  'fields' => '',
  'order' => ''
),
'Bar' => array(
  'className' => 'Bar', //name of 2nd level join ( Model Name )
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
  ),
  'fields' => '',
  'order' => ''
)
);

El problema con este método es que podría hacer consultas generales más complejo de lo necesario. Puede por lo tanto también se suman las segundas consultas de nivel directamente en te encuentre o declaración paginate de la siguiente manera: (Nota: He encontrado que por alguna razón no puede utilizar las asociaciones $ belongsTo en el segundo nivel se apunta y será necesario volver a definir ellos si ya están definidos. por ejemplo, si 'Foo' ya está definido en $ belongsTo, es necesario crear un duplicado 'foo1' para hacer el trabajo de la asociación, como el ejemplo a continuación.)

$options['joins'] = array(

array('table' => 'foos',
  'alias' => 'Foo1',
  'type' => 'inner',
  'conditions' => array(
    'CurrentModel.foo_id = Foo1.id'
  )
),
array('table' => 'bars',
  'alias' => 'Bar',
  'type' => 'inner',
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo1.bar_id'
  )
)
);

$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));

Espero que esto sea lo suficientemente clara para entender y que ayuda a alguien.

Compruebe su valor recursiva. Si es demasiado limitante, ignorará los enlaces controlable, IIRC. Recuerdo chocar con esto unas cuantas veces. Me gustaría probar que contiene varios modelos, pero mi opción recursive se fijó para 0 y nada se obtendría tirado. Por su ejemplo, yo creo que un valor de 1 (por defecto) sería suficiente, pero tal vez que haya configurado explícitamente a 0 en alguna parte?

Se pueden añadir antes de su llamada de encontrar () lo siguiente:

 $this->Question->order = 'Question.created DESC';

Sí, no podía encontrar la manera de ordenar en base al modelo relacionado / asociado, por lo que terminó usando el método Set::sort(). Pedido este artículo para una buena explicación.

// This finds all FAQ articles sorted by:
// Category.sortorder, then Category.id, then Faq.displaying_order
$faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');

... Y sí, lo que probablemente debería ser un Category->find() pero desafortunadamente el desarrollador original no lo ha codificado de esa manera, y yo no quiero volver a trabajar los puntos de vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top