60

This is related to one of my question earlier where:

Update table1 field with table2 field value in join laravel fluent

But since this is a different approach now, I will just ask another question:

How do you properly do an update using DB:raw?

I want to update the favorite_contents.type with the value of contents.type, but it doesn't do anything, the static setting of 1 to favorite_contents.expired is working.

This is my code which still doesn't update the type even when the DB::raw was used:

$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");

This is the first code that doesn't update before I resorted to the above code that doesn't work as well:

$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: This is working when done on an sql editor:

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

3 Answers 3

116

code raw updates like this:

...->update( array(
    'column' => DB::raw( 'column * 2' )
) );
Sign up to request clarification or add additional context in comments.

2 Comments

This should be the correct answer as it keeps true to the ORM as much as possible, and reduces the amount of raw SQL needed.
But ... How to set parameters for DB:raw in update statement?!
86
DB::statement("UPDATE favorite_contents, contents SET favorite_contents.type = contents.type where favorite_contents.content_id = contents.id");

Try DB::statement for raw queries that does not involve outputting something (select).

1 Comment

It's true that this is why his DB::raw() statement didn't execute anything. But the other answer that shows how to use DB::raw() within an update() is probably what most people viewing this question are probably looking for.
39

Will be work such similar, simple realization in Laravel 5.2 , Query Builder:

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

This response is tested real site and working properly

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.