Eloquent update and limit

我与影子孤独终老i 提交于 2020-01-06 12:26:04

问题


I could not figure out how can i use both update and limit methods in laravel eloquent orm.

$affectedRows = Promo::where('used','=',0)
    ->update(array('user_id' => Auth::user()->id))
    ->limit(1); // Call to a member function limit() on a non-object
    //->take(1); // Call to a member function take() on a non-object

I tried both limit and take methods.

I want to do only one result will be update.

But i think, i can not use limit or take methods on update.

Is there any way to update only one row via eloquent?


Add :

Eloquent ORM

$affectedRows = Promo::where('user_id','=',DB::raw('null'))->take(1)
        ->update(
            array(
                'user_id'       => Auth::user()->id,
                'created_ip'    =>Request::getClientIp(),
                'created_at'    => new DateTime,
                'updated_at'    => new DateTime
            )
        );

Query Builder

$affectedRows = DB::table('promos')->whereNull('user_id')
    ->take(1)
    ->update(array(
        'user_id'       => Auth::user()->id,
        'created_ip'    =>Request::getClientIp(),
        'created_at'    => new DateTime,
        'updated_at'    => new DateTime
    ));

These two codes did not add limit param to the query

Output:

update `promos` set `user_id` = '1', `created_ip` = '127.0.0.1', `created_at` = '2013-06-04 14:09:53', `updated_at` = '2013-06-04 14:09:53' where `user_id` = null

回答1:


I used raw query. There is no method limit/take for update and delete queries on both eloquent and query builder. Use

DB::update(DB::raw("UPDATE query"));

like this.




回答2:


I have not tried it but the Laravel 4 logic makes me think this syntax would work :

$affectedRows = Promo::where('used','=',0)
    ->limit(1)
    ->update(array('user_id' => Auth::user()->id));



回答3:


Talking about laravel 5 (not sure about L4), depends on db engine. MySQL supports limit for update so it works, here is the laravel code that do that:

https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php#L129

so, first ->limit(1) and then ->update([fields]);

DB::table('table')
    ->where('field', 'value')
    ->limit(1)
    ->update(['field', 'new value']);


来源:https://stackoverflow.com/questions/16918972/eloquent-update-and-limit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!