Relazioni Con Tabelle Db


(Leo Lotito) #1

Ciao a tutti, ho ricominciato a studiare Yii, e mi sono imbattuto, nelle "relazioni" tra tabelle…

Ho letto il manuale, credo di aver capito (un pochino), ma mi manca un esempio concreto…

Forse faccio prima a spiegare cosa vorrei fare e cosa ho fatto, inoltre vi chiedo quale dei due metodi è il migliore. (vedere avanti)

Ho un db con tre tabelle (potevo realizzarle in modo diverso, ma è per lo studio, quindi credo che vadano bene)

libro

id | autore

libro_genere

id | id_libro | genere

libro_titolo

id | id_libro | titolo

Ovviamente vorrei che queste tre tabelle entrino in relazione tra loro, come dovrei procedere?

Creo 3 model | libro | libro_genere | libro_titolo

quindi in ogni model dovrei creare una relazione (relations())? oppure le relazioni dovrei inserirle solo in libro_genere e libro_titolo?

Per ora con le domande sulle relazioni ‘standard’ mi fermo qui.

Io ho agito diversamente, creando nel solo model libro il seguente codice che funziona perfettamente.




$query = Yii::app()->db->createCommand()

    ->select('l.id, lg.genere, tl.titolo')

    ->from('libro l')

    ->join('libro_genere lg', 'l.id = lg.id_libro')

    ->join('libro_titolo tl', 'l.id = tl.id_libro')

    ->where(array('tl.titolo LIKE :titolo') , array(':titolo'=>'Il Signore%'))

    ->queryAll();



Ma non è meglio utilizzare le funzionalità di yii per le relazioni?

Grazie

ps. potrei essere un pochino confuso, ma lo sono veramente :rolleyes:


(Sensorario) #2

Le tabelle sono sbagliate. Se si tratta di studio vanno corrette a maggior ragione. Tu trascura l’apprendimento, e ti porterai dietro tanti brutti vizi. Questa è una base di dati corretta. L’errere più grosso che hai fatto è stato fare si che un libro potesse avere più titoli. In verità è vero che un autore più avere più libri.

libro_autore

id | cognome | nome

libro

id | fk_libro_autore | fk_genere | titolo

libro_genere

id | genere

Hai scritto

e devo farti notare che anche tu stai usando le funzionalità di Yii. Che cosa volevi dire con quella frase?

Detto ciò, sappi che ci sono due modi principali per eseguire delle interrogazioni all’interno di Yii. Una è usando l’active record ed un’altra è quella di usare il query builder. Ti racconto la via del query builder perché secondo me è più semplice da comprendere. In buona sostanza una classe PHP equivale alla tabella mentre un oggetto php corrisponde ad un singolo record.

Arrivati a questo punto, io ti suggerisco di andare nel model Libro ed aggiungere queste due relazioni:

Libro




    'genere' => array(self::BELONGS_TO, 'LibroGenere', 'fk_genere'),

    'autore' => array(self::BELONGS_TO, 'LibroAutore', 'fk_libro_autore ')



A queesto punto la tua query può diventare:


Libri::model()->with('genere:autore')->findAll();


(Antonior0409) #3

salve anch’io mi sto imbattendo in questi prime problematiche che sono soprattutto nel fatto che cerco di adottare delle best practice perchè penso che yii sia davvero ottimizzato per lo sviluppo di web app… :D

Come tutti qualli che cominciano come me ho creato delle tabelle e relazionate, e creato un CRUD con gii e su questo cominciato a comprendere il form

vado al dunque!

Come posso visualizzare nel form di modifica/creazione il campo oggetto di relazione con un altra tabella?

vorrei ottenere magari una select list con il valore di default corrispondente al valore memorizzato nella tabella e listare altri valori

I miei dubbi sono come passare la lista model da ciclare tipo ad esempio "genere"

Come includere il model "genere" nel model libri ad esempio con qui è relazionato

poichè gii non mi crea relazioni BELONGS_TO ma delle hasOne,hasMany(da sostituire?)