Heim > Fragen und Antworten > Hauptteil
$data = Model\Recipe::with(['ingredient', 'tags'])->find($recipeId);
if (empty($data)) {
return ResponseData::set($data);
}
$data->getInfoImage()->getListImage()->getPrice($locale);
return ResponseData::set($data);
Der obige Code enthält 13 Datenbankabfragen. Obwohl jede Abfrage auf diesem Computer sehr schnell ist, kann er die große Anzahl von Abfragen nicht verarbeiten.
Die Grunddaten sind wie folgt:
{
"SQL":"select * from `ak_recipe` where `ak_recipe`.`id` = ? and `ak_recipe`.`deleted_at` is null limit 1",
"bindings":[
"148"
],
"time":0.00037
},
{
"SQL":"select * from `ak_recipe_image` where `type` = ? and `recipe_id` = ? and `ak_recipe_image`.`deleted_at` is null limit 1",
"bindings":[
2,
148
],
"time":0.00046
},
{
"SQL":"select * from `ak_recipe_image` where `type` = ? and `recipe_id` = ? and `ak_recipe_image`.`deleted_at` is null limit 1",
"bindings":[
1,
148
],
"time":0.00035
},
// 。。。。
Wenn die Datenbank vom lokalen Computer auf das Intranet umgestellt wird, verdoppeln sich die Ausführungsdaten jedes SQL grundsätzlich.
Die Daten lauten wie folgt:
{
"SQL":"select * from `ak_recipe` where `ak_recipe`.`id` = ? and `ak_recipe`.`deleted_at` is null limit 1",
"bindings":[
"148"
],
"time":0.00073
},
{
"SQL":"select * from `ak_recipe_image` where `type` = ? and `recipe_id` = ? and `ak_recipe_image`.`deleted_at` is null limit 1",
"bindings":[
2,
148
],
"time":0.00075
},
{
"SQL":"select * from `ak_recipe_image` where `type` = ? and `recipe_id` = ? and `ak_recipe_image`.`deleted_at` is null limit 1",
"bindings":[
1,
148
],
"time":0.00077
},
// 。。。。
Ich frage mich, wie jeder mit solchen Beziehungsfragen umgeht? Schreiben Sie Ihr eigenes JOIN
, um den Code zu überprüfen? Oder gibt es eine andere Möglichkeit, dieses Problem zu lösen?
大家讲道理2017-05-16 16:54:17
应该没必要写原生SQL吧,改造下$data->getInfoImage()->getListImage()->getPrice($locale);
我看文档,有关联关系指定预加载查询的额外条件是类似这样的:
$users = App\User::with(['posts' => function ($query) {
$query->where('title', 'like', '%first%');
}])->get();
文档链接