-
folgender code erzeugt n+1 sql queries aufgrund des Aufrufs von gibt es eine einfache möglichkeit - unabhängig von der Anzahl an Produkten - die Datenbankabfragen zu reduzieren? $products = Product::query()->find();
foreach ($products as $product) {
echo $product->name;
echo $product->description;
$category = $product->getRelatedDataset('category_id');
echo $category->name;
} |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 1 reply
-
Mit dem Aufruf von $products = Product::query()->find();
$products->populateRelation('category_id'); // <---
foreach ($products as $product) {
echo $product->name;
echo $product->description;
$category = $product->getRelatedDataset('category_id');
echo $category->name;
} So hat man konstant zwei DB-Abfragen (statt bis zu n+1). Eine für die Produkte, und eine für alle benötigen Kategorien zusammen. Immer wenn man Man kann es auch bei verschachtelten Schleifen nutzen: $products = Product::query()->find();
$tags = $products->populateRelation('tags');
$tags->populateRelation('category_id');
foreach ($products as $product) {
echo $product->name;
echo $product->description;
foreach ($product->getRelatedCollection('tags') as $tags) {
echo $tags->name;
$category = $tags->getRelatedDataset('category_id');
echo $category->name;
}
} Ohne die |
Beta Was this translation helpful? Give feedback.
Mit dem Aufruf von
populateRelation
vor der foreach-Schleife, kann man alle verknüpften Datensätze der jeweiligen Relation vorladen:So hat man konstant zwei DB-Abfragen (statt bis zu n+1). Eine für die Produkte, und eine für alle benötigen Kategorien zusammen.
Immer wenn man
getRelatedDataset
odergetRelatedCollection
innerhalb einer Schleife aufruft, sollte man stutzig werden. In der Regel ist dannpopulateRelation
eine …