Laravel 更新查询

25

我试图根据电子邮件而不是ID更新用户,有没有一种方法可以在不使用原始查询的情况下完成此操作。

当前的错误

{"error":{"type":"ErrorException","message":"Creating default object from empty value","file":"C:\wamp\www\celeb-jim\app\controllers\SignupController.php","line":189}}

我的代码

    public function changeAccountStatus ($plan, $userEmail ){
        $UpdateDetails = User::where('email', '=',  $userEmail)->first();
        $UpdateDetails->member_type = $plan;
        $UpdateDetails->save();
    }

第189行是什么? - Jarek Tkaczyk
5个回答

38
你可以使用Laravel查询构建器,但这不是最好的方法
请查看Wader下面的答案以了解更好的Eloquent方式——它允许您检查是否有与电子邮件地址匹配的用户,并在没有时处理错误。
DB::table('users')
        ->where('email', $userEmail)  // find your user by their email
        ->limit(1)  // optional - to ensure only one record is updated.
        ->update(array('member_type' => $plan));  // update the record in the DB. 

如果您有多个字段需要更新,只需在数组末尾添加更多的值即可。

我猜你没有理解这个问题。他想在Eloquent的find()方法中提供电子邮件,并希望它与emil列匹配。 - Khan Shahrukh
当op有一个Eloquent模型设置时,为什么要使用查询构建器?问题不在于Eloquent无法轻松完成此操作,而在于在尝试设置对象属性之前没有进行空值检查(请参见我的答案)。 - Wader
@Wader 是的,你说得对。如果这不被接受,我会将其删除。你的+1是我给的。我会更新这个内容,使它更清晰明了。 - msturdy
我并没有说这样做是错误的,只是在质疑使用查询构建器相对于Eloquent的好处。我意识到我的评论听起来很严厉,抱歉。 - Wader
@Wader 没问题,你质疑它是正确的。你的回答更好! - msturdy

23

试着像这样做。

User::where('email', $userEmail)
       ->update([
           'member_type' => $plan
        ]);

1
User::where('email', $userEmail)->update(['member_type' => $plan]); - Pasindu Jayanath
这是最好的解决方案,因为这段代码只执行一个SQL查询而不是其他的。 - Simon Rusin

15

这个错误表明User::where('email', '=', $userEmail)->first()返回的是null,而不是更新模型时出现的问题。

在试图更改User属性之前,请确保您实际上有一个User,或使用firstOrFail()方法。

$UpdateDetails = User::where('email', $userEmail)->first();

if (is_null($UpdateDetails)) {
    return false;
}

或者使用firstOrFail()方法,无需检查用户是否为空,因为当模型未找到时会抛出异常(ModelNotFoundException),您可以使用App::error()来捕获异常 http://laravel.com/docs/4.2/errors#handling-errors

$UpdateDetails = User::where('email', $userEmail)->firstOrFail();

9
$update = \DB::table('student') ->where('id', $data['id']) ->limit(1) ->update( [ 'name' => $data['name'], 'address' => $data['address'], 'email' => $data['email'], 'contactno' => $data['contactno'] ]); 

7
非常简单。以下是代码:

非常简单。以下是代码:

 DB::table('user')->where('email', $userEmail)->update(array('member_type' => $plan));  

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