2012-06-23 39 views
8

Tengo una pregunta que me está volviendo loco y tengo que admitir que no tengo tanta experiencia en CakePHP. Como se menciona en esta pregunta, Using DISTINCT in a CakePHP find function, usando DISTINCT esta manera:CakePHP 2.1 - Cómo usar DISTINCT correctamente en find()

$this->Model->find('all', array('fields'=>'DISTINCT field_name')); 

no devuelve valores distintos, sino que devuelve todas las filas. De hecho, el DISTINCT aquí es completamente inútil porque, por alguna razón, CakePHP agrega TableName. id en la consulta SQL (¿por qué puedo eliminar la referencia de id?), Devolviendo efectivamente todas las claves principales DISTINCT (= todas las filas = inútil).

Por lo tanto, todavía deseo devolver los valores DISTINCT de una columna field_name particular. ¿No puedo hacerlo usando solo la función find ('all') o find ('list')? ¿Es realmente esa la forma correcta de hacerlo usando esta función Set :: extract() descrita en el enlace de arriba? Esa parece ser una solución demasiado indirecta de CakePHP, normalmente Cake me hace la vida más fácil. :-) ¿Cuál es la forma correcta de usar Find y DISTINCT juntos? Quizás DISTINCT no funciona para find()?

Mirando el libro de cocina, que dicen: "Un ejemplo rápido de hacer una consulta DISTINCT Puede utilizar otros operadores, como MIN(), MAX(), etc., de una manera similar:".

<?php 
    array(
     'fields' => array('DISTINCT (User.name) AS my_column_name'), 
     'order' = >array('User.id DESC') 
    ) 
?> 

Fuente: http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

Esto indica que distinguible sería posible utilizar, pero ¿qué es lo que aquí? ¿(Nombre de usuario) corresponde al campo nombre por el que quiero DISTINCT o my_column_name my field_name?

Finalmente, ¿ha cambiado algo de esto al migrar de CakePHP 1.xa CakePHP 2.x? Es decir, ¿las respuestas de CakePHP 1.x vistas en Stackoverflow siguen siendo relevantes?

¡Gracias de antemano!

Respuesta

9

Sí, el segundo fragmento es la forma correcta de hacer un SELECT DISTINCT en CakePHP 2.x. User.name corresponde al nombre del campo, en este caso al campo name en la tabla users. my_column_name es un alias (opcional) para el nombre de campo en el conjunto de resultados, es decir, en lugar de name el campo se llamará my_column_name en el conjunto de resultados.

+1

Gracias por la respuesta. Sin embargo, usando '$ regions = $ this-> Provider-> find ('all', array ('fields' => array ('DISTINCT (provider.region) AS region')));' o '$ regions = $ this-> Provider-> find ('all', array ('fields' => array ('DISTINCT (provider.region)'))); 'no recoge entradas únicas.En cambio, todas las filas que no es DISTINCT y no es lo que quería. La consulta SQL resultante: 'SELECT DISTINCT (' provider' .region'), 'Provider'. Id' FROM' carecrowd''providers' AS 'Provider' WHERE 1 = 1'. ¿Te confundí de alguna manera y mi código es incorrecto? – alieninlondon

+0

La consulta SQL generada es incorrecta, no debe haber 'Provider.id' en la consulta. ¿Qué versión de CakePHP usas? ¿Y qué base de datos? Al menos con CakePHP 2.1.3 y MySQL se genera la consulta correcta. – dhofstet

+0

Gracias por la respuesta. Tengo CakePHP 2.1.3 y MySQL. Entonces ese no era el problema. Sin embargo, su respuesta me llevó a pensar en otras cosas además de la sintaxis defectuosa, pero relacionada con el modelo. Resultó que el problema era que había establecido una asociación modelo para el modelo de Proveedor, sin la asociación de modelos la sintaxis anterior funciona bien. Así que Cake agregó el 'Provider.id' automáticamente a la consulta SQL, ¿se supone que es así o es un error? Pregunto porque la asociación de modelo efectivamente bloquea una consulta DISTINCT find para el modelo relevante. O tal vez me perdí algo? – alieninlondon

5

La forma correcta de utilizar distintos en hallazgo con la condición es:

$this->Model->find('all', array('fields' => array('DISTINCT Model.database_fieldname'),'conditions' => array('Model.database_fieldname' =>$val))); 

donde $ val contiene algún valor que desea pasar en la consulta.

Have a Nice Day

1

Para CakePHP 3.X

Para seleccionar campos distintos, se puede utilizar el método de distinct():

// Results in SELECT DISTINCT country FROM a table... 
$query = $articles->find(); 
$query->select(['country']) 
    ->distinct(['country']); 

CookBook Documentation

+0

Genera un GROUP BY para mí, no DISTINCT (Cake 3.5) – Davorin

Cuestiones relacionadas