La comunità italiana su CakePHP

You are not logged in. Please login or register.


Pages: 1

Atom RSS

Posts [ 4 ]

MiK

Topic: Associazioni hasOne/belongsTo personalizzate

Ciao a tutti,
ho la necessita' di effettuare l'associazione tra due modelli senza utilizzare la chiave primaria.
Cerco di spiegarmi meglio:

Ho una tabella "roles":

 id |         name         | code
----+----------------------+------
  1 | Amministratore       | AMMI
  2 | Responsabile Tecnico | RTEC

e una tabella "people":

 id | role_code | customer_id | first_name | last_name |  phone_1   |  phone_2   |          email          |       website
----+-----------+-------------+------------+-----------+------------+------------+-------------------------+---------------------
  2 | RTEC      |           1 | Tizio      | Caio      | 1234567890 | 1234567890 | tizio@example.org       |

Come notate ho un campo in comune [people.role_code = roles.code], ed e' proprio questa (e solo questa) l'associazione che vorrei fare nel modello.
Se ve lo state chiedendo: no, non posso utilizzare la chiave primaria per fare questa cosa perche' "roles" e' una tabella pensata per essere modificabile
e l'admin della mia applicazione puo' modificarne i valori così come eliminare una o piu' voci, e in quest'ultimo caso perderei l'id associato.

Ora.. ho provato a fare una cosa del genere:

class Person extends AppModel {
   var $name = 'Person';
   var $hasOne = array(
                       'Role' => array(
                                       'className'  => 'Role',
                                       'foreignKey' => false,
                                       'conditions' => 'Person.role_code = Role.code'
                                      )
                      );
}

nella speranza che questo mi generasse una query del tipo:

SELECT ... FROM people LEFT JOIN roles ON (people.role_code = roles.code)

e invece no!
Cake si ostina a voler utilizzare la chiave primaria creando una query del tipo:

SELECT ... FROM people LEFT JOIN roles ON (people.role_code = roles.code AND people.id = roles.person_id)

Ho trovato un post di un tizio col mio stesso problema, ma che non ha avuto risposta:
http://groups.google.com/group/cake-php … 222f6e5aea


Qualcuno ha mai avuto un problema analogo? Se si, come avete risolto?

Ah.. la versione di CakePHP che utilizzo e' la 1.2.0.6311

Grazie smile

Last edited by MiK (12-02-2008 17:37:31)

zuck

Re: Associazioni hasOne/belongsTo personalizzate

Ma impostare il campo "foreignKey" con "code" non funziona (facendo poi una cosa simile usando una relazione "belongsTo" in "Role")?

Last edited by zuck (12-02-2008 20:17:14)

MiK

Re: Associazioni hasOne/belongsTo personalizzate

No, perchè cake poi vuole comunque utilizzare la chiave primaria della tabella associata al modello
e quindi fara' una query del tipo: "Modello1".id = "Modello2".foreignKey, mentre a me serve poter
specificare entrambi i parametri.. Ho gia' provato sad

Saiborg

Re: Associazioni hasOne/belongsTo personalizzate

MiK wrote:

Se ve lo state chiedendo: no, non posso utilizzare la chiave primaria per fare questa cosa perche' "roles" e' una tabella pensata per essere modificabile
e l'admin della mia applicazione puo' modificarne i valori così come eliminare una o piu' voci, e in quest'ultimo caso perderei l'id associato.

Mmmmh se non ho capito male però code nella tabella roles è sicuramente unique e molto probabilmente not null, quindi sarebbe consistente come chiave primaria, non puoi usare quello ed eliminare id? Ammesso che id sia il solito intero con auto_increment non ci perdi nulla a toglierlo.

Nel modello roles dovresti poter settare:
$primaryKey = 'code'

e a quel punto le associazioni solite di Cake funzionano.

Posts [ 4 ]

Guest posting is disabled. You must login or register to post a reply.

Pages: 1

Topic info

0 guests and 0 users are reading this topic now


Forum quick jump menu

Currently used extensions: pun_topic_online_users, pun_karma, pun_admin_hook_navigator, pun_bbcode. Copyright © 2008 PunBB

[ Generated in 0.038 seconds, 14 queries executed ]