Laravel 4:如何运行原始SQL?

时间:2013-02-04 13:40:50

标签: laravel laravel-4

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

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

7 个答案:

答案 0 :(得分:137)

Laravel 4 manual中 - 它讨论了如下的原始命令:

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

编辑我刚在Laravel 4 documentation找到了这个可能更好的内容:

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

更新:在Laravel 4.1中(可能是4.0 - 我不确定) - 你也可以为原始的Where查询执行此操作:

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

进一步更新如果您特意想要进行表重命名 - 有一个架构命令 - 请参阅下面的迈克答案。

答案 1 :(得分:16)

实际上,Laravel 4确实在Illuminate/Database/Schema/Builder.php中有一个表格重命名功能,目前它只是没有记录:Schema::rename($from, $to);

答案 2 :(得分:15)

您还可以使用DB::unprepared进行ALTER TABLE次查询。

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

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

答案 3 :(得分:10)

执行此操作的最佳方法我到目前为止已经发现它可以使用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);

我发现这可以在控制器中使用,但不能在迁移中使用

答案 4 :(得分:7)

在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 selectinsertupdatedelete查询,例如:

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

有关详细信息,请参阅http://laravel.com/docs/4.2/database#running-queries

答案 5 :(得分: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');
    }

如果您只想运行没有返回resutl的sql脚本,请使用此

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

在laravel 5.1中测试

答案 6 :(得分:-1)

Laravel raw sql - 插入查询

让我们创建一个get链接来插入可通过url访问的数据。所以我们的链接名称是'insertintodb',在该函数中我们使用db类。 db类帮助我们与数据库进行交互。我们用db类静态函数插入。在插入函数内部,我们将编写PDO查询以在数据库中插入数据。在下面的查询中,我们将在“帖子”表中插入“我的标题”和“我的内容”作为数据。

将以下代码放在路径目录中的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 - 读取查询:

现在,让我们创建一个get链接来读取数据,可以通过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