Laravel 4:如何运行原始SQL?


78

我想在Laravel 4中重命名表,但不知道该怎么做。

SQL是alter table photos rename to images。如果有一个雄辩的解决方案,我也想知道如何运行原始SQL,因为有时别无选择。

Answers:


146

Laravel 4手册中-讨论了执行以下原始命令:

DB::select(DB::raw('RENAME TABLE photos TO images'));

编辑:我刚刚在Laravel 4文档中找到了它,可能更好:

DB::statement('drop table users');

更新:在Laravel 4.1(也许是4.0-我不确定)中,您还可以针对原始的Where查询执行此操作:

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();

进一步更新如果您特别想进行表重命名-有一个用于此的模式命令-有关此信息,请参见下面的Mike回答。


4
Mike Branski在下面提到了一个实际的Schema :: rename($ from,$ to)函数。使用它,它将与数据库无关。
trm42

Schema::rename($from, $to)如我,@ trm42和@Mike Branski所提到的,如果没有使用正确的L4方法,为什么这是可接受的答案?请考虑对其进行更改以向其他观众提供最新答案。
肖恩·比恩

1
因为标题是“如何运行原始SQL?” 但问题包括有关重命名表的示例。问题还说I'd also like to know how to run a raw SQL-所以我的回答是关于那部分的。您是正确的,该Schema::rename()功能对于表重命名的特定情况很有用。
劳伦斯2015年

确实如此,但是我的问题是针对OP @duality_。(顺便说一句,我质疑这是否应该被接受的原因是因为它没有为查看者提供运行原始查询的现在标准的方法,如laravel.com/docs/4.2/database#running-queries所述实际上,您的说法“还有一些命令可以进行模式更改-但重命名表不是其中之一。”自2013年2月〜以来一直是不正确的。如果您希望此命令仍然是公认的答案,建议您更新它,以便对将来的观看者更有用。)
肖恩·比恩


15

您也可以DB::unprepared用于ALTER TABLE查询。

DB::unprepared旨在用于诸如之类的查询CREATE TRIGGER。但实际上,它直接执行原始sql查询。(不使用PDOprepared语句)

https://github.com/laravel/framework/pull/54


当我想使用时对我有用DB::query("SET foreign_key_checks=0");
swdev 2014年

1
@swdev:PDO支持SET 查询。但是,使用DB::queryPDO::query)会不必要地创建准备好的语句,因为上述查询没有变量。
smitrp

10

到目前为止,我发现最好的方法是通过Laravel并直接使用Pdo对象执行查询。

DB::connection()->getPdo()->exec( $sql );

我通常发现一次查询的速度更快,效率更高,只需打开数据库查询工具并使用完整语法检查键入查询,然后直接执行即可。

如果您必须使用存储过程或需要使用任何数据库功能,那么这变得至关重要

示例2: 将created_at设置为所需的值,并在侧面倾斜任何碳的时髦度

$sql = 'UPDATE my_table SET updated_at = FROM_UNIXTIME(nonce) WHERE id = ' . strval($this->id);
DB::statement($sql);

我发现这在控制器中有效,但在迁移中无效


太棒了,终于有了可行的解决方案。我必须这样做,因为我在做DB::connection()->getPdo()->exec('USE '.$dbConfig['database']);。我在Laravel命令中删除并重新创建了数据库,并且需要这样做。
Aditya MP 2014年

1
感谢您的答复。我们找到执行原始创建表查询的最简单方法
sujivasagam

1
根据$ this-> id的位置,它可能容易受到sql注入的攻击。
北极

如果要将任何类型的用户输入注入到任何查询中,具有在一个字符串中执行多个SQL命令的能力非常危险。这应该在答案中注明。(有关如何防止这种情况的信息,请参见php.net/manual/en/function.pg-escape-string.phpphp.net/manual/en/mysqli.real-escape-string.php。)此外,这仅能回答OP的一半问题(如何运行原始SQL查询,而不是如何在Laravel 4中重命名表)或表明存在官方解决方案(请参阅laravel.com/docs/4.2/schema#creating-and-dropping-表格)。投票失败。
肖恩·宾恩

8

在Laravel 4中重命名表的公认方法是使用“架构”构建器。所以你想做:

Schema::rename('photos', 'images');

来自http://laravel.com/docs/4.2/schema#creating-and-dropping-tables

如果您真的想自己写一个原始的SQL查询,则可以随时执行以下操作:

DB::statement('alter table photos rename to images');

注:Laravel的DB类还支持运行原始的SQL selectinsertupdate,和delete查询,如:

$users = DB::select('select id, name from users');

有关更多信息,请参见http://laravel.com/docs/4.2/database#running-queries


2

这是我关于如何运行RAW SELECT,获取结果和访问值的简化示例。

$res = DB::select('
        select count(id) as c
        from prices p 
        where p.type in (2,3)
    ');
    if ($res[0]->c > 10)
    {
        throw new Exception('WOW');
    }

如果只想运行没有返回结果的sql脚本,请使用此命令

DB::statement('ALTER TABLE products MODIFY COLUMN physical tinyint(1) AFTER points;');

在laravel 5.1中测试


1

Laravel Raw SQL –插入查询:

让我们创建一个获取链接以插入可通过url访问的数据。因此,我们的链接名称为'insertintodb',在该函数内,我们使用db class。db类可帮助我们与数据库进行交互。我们使用db类静态函数insert。在insert函数内部,我们将编写PDO查询以在数据库中插入数据。在下面的查询中,我们将'my title'和'my content'作为数据插入posts表中。

将以下代码放在路由目录内的web.php文件中:

Route::get('/insertintodb',function(){
DB::insert('insert into posts(title,content) values (?,?)',['my title','my content']);
});

现在从上方的浏览器链接上方触发插入查询:

localhost/yourprojectname/insertintodb

您可以通过进入数据库表来查看上述插入查询的输出。您会找到一条ID为1的记录。

Laravel Raw SQL –阅读查询:

现在,让我们创建一个获取链接来读取数据,该链接可以通过url访问。因此我们的链接名称为“ readfromdb”。我们对db类的静态函数进行读取。在读取函数内部,我们将编写PDO查询以从数据库读取数据。在下面的查询中,我们将从posts表中读取ID为'1'的数据。

将以下代码放在路由目录内的web.php文件中:

Route::get('/readfromdb',function() {
    $result =  DB::select('select * from posts where id = ?', [1]);
    var_dump($result);
});

现在从上方浏览器链接上方的读取查询中触发:

localhost/yourprojectname/readfromdb

美好的一天,什么是DB的第二个参数::选择(...在文档中我找不到它,请帮助。
叶夫根尼·阿法纳西耶夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.