DAO, Query Builder e Active Record

Salve a tutti,

vorrei chiedere un po’ di delucidazioni riguardo il sottosistema di query di Yii.

I dubbi sorgono riguardo DAO, Query Builder, Active Record.

Mi pare di aver capito che tutte e tre si appoggiano a PDO.

  • DAO mi permette di scrivere query usando SQL puro.

  • QB permette di eseguire query più complesse usando un insieme di metodi predefiniti.

  • AR è la metodologia più semplice di interrogazione, focalizzata soprattutto sulle operazioni CRUD di base.

  1. Sono giuste queste considerazioni?

  2. Fino a che livello di complessità posso usare AR.

  3. Dato che per query complesse si deve usare DAO, quando dovrei usare QB?

  4. Usando DAO, dato che (forse) uso sintassi SQL, non vado a inficiare la portabilità del codice (cioè query dipendenti dal DB)?

Grazie

KK

Bella domanda.

Questo è un argomento poco sviscerato sul forum italiano del nostro amato framework 2.0 e meriterebbe di essere approfondito per bene.

Magari con qualche esempio pratico che faccia capire le differenze.

Hai già provato a leggere la parte di documentazione inerente il database?

in parte ti sei risposto da solo: utilizzando QB eviti di scrivere sql aumentando la portabilità ed hai in + alcune feature di escape e funzioni di join e altro.

per quanto riguarda l’AR viene utilizzato per mappare ogni riga della tabella con oggetti ed è molto utile per incapsulare funzioni e legami applicabili ad ogni riga di quella determinata tabella. Ovviamente questo comporta un discreto carico di informazioni nel caso l’applicazione preveda la gestione di grosse quantità di dati (ma intendo veramente grosse e cmq il problema viene risolto utilizzando caching e lazy loading)

spero di esserti stato d’aiuto

Per una query del genere posso usare QB?




select ti.name Institute, nc.NCourses NCourses, no.NOperators NOperators

from tbl_institutes as ti

inner join (

	select ti.id_institute istitute, count(tc.institute) NCourses

	from tbl_institutes as ti

        left join tbl_courses as tc

    	on ti.id_institute = tc.institute

	group by ti.id_institute

) as nc

on ti.id_institute = nc.istitute

inner join (

	select ti.id_institute istitute, count(top.institute) NOperators

	from tbl_institutes as ti

    	left join tbl_operators as top

    	on ti.id_institute = top.institute

	group by ti.id_institute

) as no

on ti.id_institute = no.istitute;



Se vedo bene hai tre tabelle:

  • tbl_institutes

  • tbl_courses

  • tbl_operators

Io farei o qualche cosa di simile.




select

    name,

    (select count(*) from tbl_courses c where c.institute = i.id_institute),

    (select count(*) from tbl_operators o where o.institute = i.id_institute)

from

    tbl_institures i



Senza contare che per semplificarti la vita potresti già avere a gratis questi "count" sfruttando AR di yii.

Complimenti!