如何使用db::raw在Laravel Fluent上执行更新查询

55

这与我之前的一个问题有关,链接如下:

Update table1 field with table2 field value in join laravel fluent

但是由于现在采用了不同的方法,所以我将提出另一个问题:

如何正确地使用DB: raw进行更新?

我想要将 favorite_contents.type 更新为 contents.type 的值,但它没有做任何事情,而将 favorite_contents.expired 设置为 1 是有效的。

这是我的代码,即使使用了DB::raw,仍然无法更新类型:

$table = 'favorite_contents';
$contents = DB::table($table)
            ->join('contents', function($join) use($table){
                $join->on("$table.content_id", '=', 'contents.id');
            })
            ->whereIn("$table.content_id",$ids)
            ->update(array(
                    "$table.expired" => 1
            ));

DB::raw("UPDATE favorite_contents, contents SET favorite_contents.type = contents.type where favorite_contents.content_id = contents.id");

这是我尝试了上面那个不起作用的代码之前,第一个没有更新的代码:

$table = 'favorite_contents';
$contents = DB::table($table)
        ->join('contents', function($join) use($table){
            $join->on("$table.content_id", '=', 'contents.id');
        })
        ->whereIn("$table.content_id",$ids)
        ->update(array(
                "$table.expired" => 1,
                "$table.type" => "contents.type"
        ));

P.S: 在 SQL 编辑器中执行以下命令可以正常工作:

UPDATE favorite_contents, contents SET favorite_contents.type = contents.type where favorite_contents.content_id = contents.id

3个回答

112

代码原始更新如下:

...->update( array(
    'column' => DB::raw( 'column * 2' )
) );

2
这应该是正确的答案,因为它尽可能地保持了ORM的真实性,并减少了所需的原始SQL量。 - Matt Inamdar
3
但是...如何在更新语句中为DB:raw设置参数呢?! - Amirreza Nasiri

81
DB::statement("UPDATE favorite_contents, contents SET favorite_contents.type = contents.type where favorite_contents.content_id = contents.id");

尝试使用DB::statement进行原始查询,它不涉及输出任何内容(如选择操作)。


3
确实,这就是为什么他的DB::raw()语句没有执行任何操作。但是,展示如何在update()内使用DB::raw()的另一个答案可能是大多数查看此问题的人所寻找的。 - orrd

37

在 Laravel 5.2 中,查询构建器会类似地工作,并且实现简单。

DB::table('stores')
            ->where('id', $request)
            ->update(['visibility' =>DB::raw($value)]);

这个响应已在真实网站上测试并正常工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接