Quando si programma in PHP, cerco sempre di creare "modelli" (classi) significativi che corrispondono alle tabelle nel database. Incontro spesso il seguente problema:Pulizia della struttura OO rispetto alle prestazioni SQL
Supponendo di aver creato un database con due tabelle: authors
e blogs
, che hanno entrambi un modello corrispondente nella mia applicazione.
Diciamo che voglio stampare tutti i blog con informazioni sull'autore, avrei dovuto fare qualcosa di simile:
<?php
foreach ($app->getBlogs() as $blog) {
echo "<h1>" . $blog->title . "</h1>";
echo "Written by" . $blog->getAuthor()->name . "</p>";
// ... et cetera
}
?>
Il problema è che l'applicazione sarà ora il fuoco 1 query SQL ottenere tutti gli articoli del blog e [numero di articoli del blog] query per ottenere le informazioni per ogni autore. Avendo SQL semplice usato avrei potuto recuperare queste informazioni utilizzando una semplice query:
SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author
Qual è il modo migliore di affrontare tali questioni: lo sviluppo di un'applicazione orientata agli oggetti senza eseguire troppe query SQL inutili.
Una sorta di soluzione che ho pensato a me stesso ma il punto è: non so in anticipo se l'autore-oggetto è mai necessario, $ blog-> getAuthor() potrebbe non essere mai chiamato ma avrei recuperato l'informazione comunque con la soluzione fornita. – Thijs
Quello che stai chiedendo è impossibile, allora. In pratica stai chiedendo un codice che in qualche modo sappia in anticipo cosa utilizzerai. Devi hardcode te stesso; devi scegliere il caricamento pigro, che è efficiente se vuoi solo pochi autori ma non tutti, o il caricamento in batch, come descritto sopra, che è efficiente se hai bisogno di molti Autori. Non puoi avere entrambi. – ryeguy
Lo strumento ORM che usiamo qui in Inntec avrebbe generato classi per (a) tirando giù un singolo Autore e un altro per (b) tirando giù una raccolta di Autori. Quindi potrei facilmente dire "prendi tutti gli autori che hanno la lettera" m "nel nome" o quasi qualsiasi altra cosa. Tuttavia, sia (a) che (b) tirano giù l'intero Autore, quindi tutti i campi attraversano il filo. Se volevi un solo campo per un caso speciale o se avevi bisogno di un join insolito, dovresti scriverlo da solo. Che va bene Io uso il codice gen'd il 90% delle volte. –