Domanda

Vorrei ricevere dati del modello da find (tutti), ma l'utente dovrebbe ottenere solo un insieme limitato di campi della tabella. E 'semplice:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

Ma questo modello (Dipendenti modello) ha anche un'associazione belongsTo:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

Voglio il campo Address.full_name ad apparire in miei dati recuperati troppo. Ma non funziona con la chiamata find () di cui sopra, e genera un errore (Error SQL: 1054: Unknown colonna 'Address.full_name' in 'dei campi') quando si tenta in questo modo:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

Qualcuno sa come risolvere questo?

Modifica Ho completamente dimenticato che Address.full_name è un campo virtuale. Guardando il CakePHP-prodotto SQL, è ovvio il motivo per cui non funziona:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

Nel modello di indirizzo, FULL_NAME si definisce in questo modo:

var $virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);

Allora, la domanda è: è un bug CakePHP che non è in grado di includere campi virtuali (del modello estero) all'interno di un fieldlist forniti da trovare ()

?
È stato utile?

Soluzione

Purtroppo, non è possibile utilizzare i campi virtuali il modo che si desidera. Da Limitazioni di Virtual Campi nella documentazione torta:

  

L'attuazione di virtualFields in 1.3 presenta alcune limitazioni. In primo luogo non è possibile utilizzare virtualFields su modelli associati per le condizioni, l'ordine, o campi array. In questo modo sarà generalmente come risultato un errore SQL come i campi non vengono sostituiti dal ORM. Questo perché è difficile stimare la profondità a cui si potrebbe trovare un modello associato.

Sembra che dovrete utilizzare il comportamento contenibile.

Altri suggerimenti

Vorrei utilizzare il comportamento contenibile in questo caso.

assicurarsi di avere il comportamento contenibile caricata nel modello dei dipendenti prima:

var $actsAs = array('Containable');

Poi, quando si sta cercando di ottenere i dati, fare in questo modo:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

Maggiori informazioni sul comportamento contenibile qui: http://book.cakephp.org/view/1323 / contenibile

  

Errore SQL: 1054: Unknown column   'Address.full_name' in 'dei campi')

Questo errore si dà un indizio che qualcosa non va sia con la chiamata nome della colonna (potrebbe essere fullname piuttosto che full_name) o, più probabilmente la vostra definizione del modello. Impiegato belongsTo un indirizzo ma non il haveOne Indirizzo o havemany dipendenti?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top