Laravel的原始SQL函数之间的区别

时间:2014-08-17 03:47:50

标签: php laravel-4 eloquent

我似乎并不是唯一一个在Laravel的DB :: raw(),DB :: select(),DB :: statement()和DB :: unfpared之间挣扎的人() 方法。似乎人们几乎需要尝试使用全部4的给定SQL语句来识别哪个将起作用。任何人都可以澄清它们之间的关系,以及用于何种目的的方法?

2 个答案:

答案 0 :(得分:14)

我会尽力澄清:

DB ::原料()

它生成一个原始和已清理的SQL字符串,以传递给其他查询/语句,从而阻止SQL注入。是和所有人一起使用而且从不孤单。并且您永远不应该向查询/语句发送未经过清理的字符串。

DB::select(DB::raw('select * from whatever'));

DB ::选择()

用于简单选择:

DB::select(DB::raw('select * from whatever'));

DB ::语句()

我认为它适用于选择,但应该用于非SQL查询命令:

DB::statement(DB::raw('update whatever set valid = true;'));

DB ::无准备()

Laravel中的所有SQL命令都是默认准备的,但有时您需要在未准备模式下执行命令,因为某些数据库中的某些命令无法在准备模式下运行。这是我打开的一个问题:https://github.com/laravel/framework/issues/53

DB::unprepared(DB::raw('update whatever set valid = true;'));

答案 1 :(得分:0)

Laravel> = 5.0的更多正确答案(我认为)

DB :: raw()

产生“ raw”,表示“未消毒”的字符串。这就是在Laravel Docs上出现警告的原因:

laravel docs warning about using raw strings in db queries

DB :: select(),DB :: insert(),DB :: update(),DB :: delete()

这些是Laravel提供的运行准备好的语句的实用方法。

DB :: statement()

这再次用于运行不特定于CRUD的准备好的语句。

The methods which use prepared statements为SQL注入提供保护,而使用raw expressions时,此责任属于程序员。

DB :: unprepared()

Laravel Docs上没有关于它的信息,而互联网上只有很少的信息。尽管如此,我还是根据上面的答案对此进行了测试:

Laravel, create MySQL trigger from Migration

例如我尝试首先使用DB :: statement()方法创建MySQL触发器,但在迁移时却给了我这个错误:

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if
your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.")
      C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  2   PDOStatement::execute()
      C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

但是,当我使用DB :: unprepared()测试它时,它运行顺利。 (Laravel 5.8)