Cuando programo en PHP siempre trato de crear 'modelos' significativos (clases) que corresponden a tablas en la base de datos. A menudo encuentro el siguiente problema:Limpiar estructura OO vs. rendimiento de SQL
Suponiendo que he creado una base de datos con dos tablas: authors
y blogs
, que tienen un modelo correspondiente en mi aplicación.
Digamos que quiero imprimir todos los blogs, junto con información sobre el autor, que tendría que hacer algo como esto:
<?php
foreach ($app->getBlogs() as $blog) {
echo "<h1>" . $blog->title . "</h1>";
echo "Written by" . $blog->getAuthor()->name . "</p>";
// ... et cetera
}
?>
El problema es que la aplicación será ahora el fuego 1 consulta SQL a obtenga todos los artículos del blog y las consultas de [número de artículos del blog] para obtener la información de cada autor. Tener SQL directo utilizado Podría haber recuperado esta información mediante una consulta sencilla:
SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author
¿Cuál es la mejor manera de hacer frente a estas cuestiones: el desarrollo de una aplicación orientada a objetos sin ejecutar demasiadas consultas SQL inútiles.
Algún tipo de solución en la que he pensado, pero el punto es: no sé de antemano si alguna vez se necesita el objeto de autor, $ blog-> getAuthor() podría no llamarse nunca pero lo habría recuperado la información, no obstante, con la solución provista. – Thijs
Lo que estás preguntando es imposible, entonces. Básicamente estás pidiendo un código que de alguna manera sepa de antemano qué vas a usar. Tienes que codificarlo tú mismo; debe elegir la carga diferida, que es eficiente si solo quiere unos pocos Autores pero no todos, o la carga por lotes, como se describió anteriormente, que es eficiente si necesita muchos Autores. No puedes tener ambos. – ryeguy
La herramienta ORM que usamos aquí en Inntec habría generado clases para (a) derribar un autor único y otro para (b) retirar una colección de autores. Por lo tanto, podría decir fácilmente "obtener todos los autores que tengan la letra 'm' en el primer nombre" o casi cualquier otra cosa. Sin embargo, ambos (a) y (b) despliegan todo el autor, por lo que todos los campos van por el cable. Si quisiera un solo campo para un caso especial, o si necesitara una unión inusual, tendría que escribirlo usted mismo. Lo cual está bien. Utilizo el código gen'd el 90% del tiempo. –