CDbCriteria select e ambiguous columns

Ciao a tutti,

il problema di oggi è questo. :P

Ho due tabelle flk_users e flk_cards legate da una relazione uno a molti flk_users.id-flk_cards.user_id.

Entrambe le tabelle hanno un campo status int(1).

Vorrei implementare la query:


SELECT u.id, u.username FROM `flk_users` `u` JOIN flk_cards c ON u.id = c.user_id ORDER BY u.username ASC

con AR e CDbCriteria in un metodo della classe FlkUsers.

Ecco il codice:


$criteria = new CDbCriteria;

$criteria->alias = 'u';

$criteria->select= 'u.id,u.username';

$criteria->join= 'JOIN flk_cards c ON u.id = c.user_id';

$criteria->order=' u.username ASC';

$users = self::model()->findAll($criteria);

Mi viene ritornato il seguente errore:


CDbCommand ha riportato un errore nell'esecuzione della query SQL: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in field list is ambiguous. The SQL statement executed was: SELECT id, username, email, createtime, lastvisit, superuser, status, u.id, u.username FROM `flk_users` `u` JOIN flk_cards c ON u.id = c.user_id ORDER BY u.username ASC

Mi sembra di capire che il campo ‘status’ è ambiguo…

Ora, ho tre domande:

Perchè l’SQL generato contiene tutti i campi di flk_users anche se ho specificato


$criteria->select= 'u.id,u.username'

?

In che senso ‘status’ è ‘ambiguous’?

Che cosa sto sbagliando e come posso risolvere? ???

Grazie!

Andrea

il campo è abiguos perchè ha lo stesso nome su entrambe le tabelle, nella query che stai cercando di creare non sarebbe un problema se non ti aggiungesse gli altri campi.

Il perchè lo faccia lo ignoro, forse dipende dall’alias, prova a non mettere u ed utilizza quello di default t.

Di default l’alias è t. Se fai la stessa cosa con NomeTabella::model() al posto di self::model() forse non ha lo stesso comportamento.

Ragazzi grazie degli aiuti :)

Ho risolto! ;D

Non avevo visto il metodo defaultScope(), in cui veniva definito l’attributo ‘select’, che forzava la selezione di tutti i campi della tabella del model (sto usando una classe non mia)…e neanche avevo capito la funzione e l’importanza di defaultScope() :P

Rimosso il ‘select’, il campo status non viene più selezionato e non entra in conflitto con il campo omonimo della tabella messa in relazione.

Grazie,

Andrea