Sto cercando di capire meglio le prestazioni in PHP. Un problema a cui sto pensando è il problema n + 1. Con n + 1 intendo qualcosa del genere:
$posts = Posts::getPosts();
foreach($posts as $post) {
$comments = Comments::getComments(array('post_id' => $post->id));
// do something with comments..
}
È abbastanza inefficiente dato che dobbiamo fare molte domande per ogni post per ottenere i commenti.
È qualcosa di simile meglio? È più codice PHP, ma verranno eseguite solo due query:
$posts = Posts::getPosts();
// get the ids into an array
$post_ids = array();
foreach($posts as $post) {
array_push($post_ids, $post->id);
}
// get comments for ALL posts in one query by passing array of post ids (post_id IN (...))
$comments = Comments::getComments(array('post_id' => $post_ids));
// map comments to posts
foreach($posts as $key => $post) {
foreach($comments as $comment) {
if($post->id == $comment->post_id) {
$post->pushComment($comment);
}
}
}
foreach($posts as $post) {
$comment = $post->comments;
// do something with comments..
}
Questo è molto più PHP e anche un po 'disordinato, ma stavolta sto usando solo due query (una per i post, l'altra per il recupero di TUTTI i commenti di quei post in una query). Questa è una buona proposta per affrontare il problema n + 1 in PHP?
Inoltre, in che modo i framework generalmente trattano questo sotto il cofano?