Eloquent 是否缓存准备好的语句?

Does Eloquent cache prepared statements?

我有一系列 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 使用准备好的语句,但它会在每次迭代中 重新准备 相同的查询,还是它足够聪明来缓存准备好的 INSERT 语句在第一次迭代中,然后在每个后续迭代中简单地 运行 ->execute?

来自PHP's PDO documentation

By using a prepared statement the application avoids repeating the analyze/compile/optimize cycle. This means that prepared statements use fewer resources and thus run faster.

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

好吧,智能应用程序当然 不会 让每个准备好的语句永远打开以防万一。这种行为弊大于利。

关于 'good',您在 "caching" 和 "analyze/compile/optimizing" 中赋予了太多意义。从准备好的语句中获得速度增益的想法有点夸张。就您的具体情况而言,INSERT 查询中没有太多需要优化的地方,您知道。你永远无法测量这样的 "optimization"。

因此,没有什么可担心的。

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

有一个对 $query->insert 的调用,它是 Illuminate\Database\Query\Builder class 的一个实例。

现在查看上述生成器 class 中的方法 insert

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

开源代码的好处是可以自由翻看,不用怕翻。

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