代码之家  ›  专栏  ›  技术社区  ›  alexw

Eloquent缓存准备好的语句吗?

  •  3
  • alexw  · 技术社区  · 10 年前

    我有一系列 INSERT 要执行的语句,我想使用Laravel的Eloquent这样做:

    $mountain = Mountain::find(1);
    $dragons = [1, 2, 3, 4];
    foreach ($dragons as $id){
        $mountain->dragons()->attach($id);  // Eloquent performs an `INSERT` here
    }  
    

    我知道Eloquent使用事先准备好的陈述,但会吗 重新准备 在每次迭代中使用相同的查询,或者缓存准备好的 插入,插入 语句,然后简单地运行 ->execute 在每个后续迭代中?

    从…起 PHP's PDO documentation :

    通过使用准备好的语句,应用程序避免重复分析/编译/优化循环。这意味着准备好的语句使用更少的资源,因此运行速度更快。

    我意识到,在整个应用程序生命周期中保存每个准备好的语句可能不是最好的主意,但在某些情况下,这似乎是有道理的。如果Eloquent在默认情况下不这样做,有没有方法告诉它缓存为特定模型操作准备的语句?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Chris    10 年前

    结账 Illuminate\Database\Eloquent\Relations\BelongsToMany.php::attach .

    有人打电话给 $query->insert ,它是 Illuminate\Database\Query\Builder

    现在看看方法 insert 在所述生成器类中。

    我不会发布Laravel代码,因为它太长了,但您可以清楚地看到,查询是立即针对当前连接编译和执行的。

    开源代码的优点是你可以自由地浏览它,所以不要害怕浏览它。

    正如你的常识所指出的,这里节省的时间是分钟。如果您正在执行许多插入,这不会成为您的瓶颈。也许看看队列或后台服务——当你的应用程序执行1000次插入时,用户不需要等待。

        2
  •  1
  •   Your Common Sense    10 年前

    当然是智能应用 不会的 让每一份准备好的声明永远公开,以防万一。这种行为弊大于利。

    关于“好”,你在“缓存”和“分析/编译/优化”中赋予了太多的意义。从准备好的陈述中获得速度的想法有点夸张。说到您的具体情况,您知道,INSERT查询没有太多需要优化的地方。你永远无法衡量这样的“优化”。

    因此,没什么好担心的。