2012-06-23 13 views
8

Ho una domanda che mi sta facendo impazzire e devo ammettere che non sono così esperto in CakePHP. Come accennato in questa questione, Using DISTINCT in a CakePHP find function, usando DISTINCT in questo modo:CakePHP 2.1 - Come utilizzare correttamente DISTINCT in find()

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

non restituisce valori distinti, ma restituisce tutte le righe. In effetti, il DISTINCT qui è completamente inutile perché, per qualche ragione, CakePHP aggiunge TableName. id nella query SQL (perché posso rimuovere il riferimento id ??), restituendo effettivamente ogni chiave primaria DISTINCT (= all rows = unhelpful).

Quindi, voglio ancora restituire i valori DISTINCT di una particolare colonna nome_campo. Non posso farlo usando solo la funzione find ('all') o find ('list')? E 'davvero il modo corretto di farlo usando questa funzione Set :: extract() descritta nel link sopra? Questa sembra essere una soluzione eccessivamente indiretta di CakePHP, normalmente Cake mi rende la vita più facile. :-) Qual è il modo corretto di usare find e DISTINCT insieme? Forse DISTINCT non funziona per find()?

Guardando il libro di cucina, dicono: "Un rapido esempio di fare una query DISTINCT È possibile utilizzare altri operatori, come ad esempio MIN(), MAX(), ecc, in modo simile:".

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

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

Questo indica che DISTINCT dovrebbe essere possibile utilizzare, ma che cosa è ciò che qui? Does (User.name) corrisponde al campo_name Voglio DISTINCT o è my_column_name my field_name?

Infine, è cambiato qualcosa durante la migrazione da CakePHP 1.x a CakePHP 2.x? Quali sono le risposte per CakePHP 1.x viste su Stackoverflow ancora rilevanti?

Grazie in anticipo!

risposta

9

Sì, il secondo snippet è il modo corretto di fare un SELECT DISTINCT in CakePHP 2.x. User.name corrisponde al nome del campo, in questo caso al campo name nella tabella users. my_column_name è un alias (facoltativo) per il nome del campo nel set di risultati, ovvero anziché name il campo sarà denominato my_column_name nel set di risultati.

+1

Grazie per la risposta. Tuttavia, usando '$ regions = $ this-> Provider-> find ('all', array ('fields' => array ('DISTINCT (provider.region) AS region')));' or '$ regions = $ this-> Provider-> find ('all', array ('fields' => array ('DISTINCT (provider.region)'))); 'non rileva voci univoche.Invece tutte le righe che non sono DISTINTE e non ciò che volevo. La query SQL risultante: 'SELECT DISTINCT (' provider' .region'), 'Provider' .id' FROM' carecrowd' .providers' AS 'Provider' WHERE 1 = 1'. Ti ho dimenticato in qualche modo e il mio codice è errato? – alieninlondon

+0

La query SQL generata non è corretta, non ci dovrebbe essere 'Provider.id' nella query. Quale versione di CakePHP usi? E quale database? Almeno con CakePHP 2.1.3 e MySQL viene generata la query corretta. – dhofstet

+0

Grazie per la risposta. Ho CakePHP 2.1.3 e MySQL. Quindi non era questo il problema. Tuttavia, la tua risposta mi ha portato a pensare ad altre cose oltre alla sintassi errata, ma legata al modello. A quanto pare, il problema era che avevo stabilito un'associazione modello per il modello Provider, senza l'associazione del modello la sintassi di cui sopra funziona correttamente. Quindi Cake ha aggiunto automaticamente 'Provider.id' alla query SQL, dovrebbe essere in questo modo o si tratta di un bug? Le sto chiedendo poiché l'associazione modello blocca efficacemente una query di ricerca DISTINCT per il modello pertinente. O forse mi sono perso qualcosa? – alieninlondon

5

Il modo corretto di utilizzare distinte in Trova con condizione è:

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

dove $ val contiene un certo valore che si desidera passare nella query.

have a nice day

1

Per CakePHP 3.X

Per selezionare i campi distinti, è possibile utilizzare il metodo distinct():

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

CookBook Documentation

+0

Genera un GROUP BY per me, non DISTINCT (Cake 3.5) – Davorin