Lumen - Laravel-Beziehungsabfrage, es wird eine große Anzahl von Abfragen geben, wie kann man sie lösen?
为情所困
为情所困 2017-05-16 16:52:17
0
3
460
        $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?

为情所困
为情所困

Antworte allen(3)
左手右手慢动作

ORM 效率是比较慢的,如果最求性能不妨试试直接使用DB类

大家讲道理

应该没必要写原生SQL吧,改造下$data->getInfoImage()->getListImage()->getPrice($locale);我看文档,有关联关系指定预加载查询的额外条件是类似这样的:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');

}])->get();

文档链接

Peter_Zhu

用DB门面代替Eloquent ORM。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage