Laravel DB::insert() 和 DB::table()->insert() 的区别
Posted
技术标签:
【中文标题】Laravel DB::insert() 和 DB::table()->insert() 的区别【英文标题】:Difference between Laravel DB::insert() and DB::table()->insert() 【发布时间】:2016-12-31 08:01:22 【问题描述】:我一直在试图弄清楚何时使用哪一个,以及是否应该同时使用。
一直在查看 Laravel 文档,它们都在里面。据我所知,DB::insert()
提供了比DB::table()->insert()
更多的“定制”查询。
在如何以及何时使用哪个方面,谁能澄清两者的确切区别?
【问题讨论】:
【参考方案1】:DB::insert()
为raw sql queries。示例:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
DB::table()->insert()
为query builder。示例:
DB::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
查询生成器将条件编译为原始 sql 查询,但我使用它是因为它更方便。
【讨论】:
我认为是这样。但是,与其他相比,任何一个都更受欢迎吗?例如,我不知道如何在 Query Builder 中使用“插入忽略”,所以我选择了 raw sql。那么在使用它们时有什么优缺点需要考虑吗? 您已经回答了您的问题。查询构建器适用于最常见的情况,如果您需要一些特定的 - 使用原始查询。没有优点和缺点,他们以不同的方式做同样的事情。查询生成器更方便、更易读——仅此而已。 嗨,在运行 DB::insert() 后,下一个 PDO 准备语句抱怨以下错误:> [2017-06-08 03:04:41] local.ERROR: PDOException: SQLSTATE [HY000]:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。在每个 DB::insert() 之后是否需要运行一个命令?谢谢【参考方案2】:您总是尽量使用查询生成器,它可以防止 SQL 注入。
Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。无需清理作为绑定传递的字符串
查询生成器还有助于处理值中的特殊字符,例如 '、"。对于原始语句,您需要自己处理特殊字符。
【讨论】:
以上是关于Laravel DB::insert() 和 DB::table()->insert() 的区别的主要内容,如果未能解决你的问题,请参考以下文章