无法为模型的属性设置新值

时间:2019-05-20 07:32:41

标签: php laravel laravel-5 eloquent

我正在尝试为Model的属性设置新值,但是它不起作用。设置新值后,我会立即使用dd(),但它会保留旧值。

$business->users()
    ->where('userable_id', $business->id)
    ->where('userable_type', 'App\Models\Business')
    ->first()->first_name = "New";

3 个答案:

答案 0 :(得分:7)

尝试以下方法:

$business->users()
    ->where('userable_id', $business->id)
    ->where('userable_type', 'App\Models\Business')
    ->first()->update(['first_name' => "New"]);

$model->attribute = 'foo';这样的直接对象属性分配只会影响内存中的状态,而不会在数据库中进行更改。

所以你要么去

$model->update(['attribute' => 'value']);

$model->attribute = 'value';
$model->save();

Reference


更新1:

正如我在回答的注释中所写,有时first()可能会返回null,如果找不到任何模型。我想建议firstOrFail()

请注意,predefined handler类(firstOrFail()抛出)没有ModelNotFound,因此您想在Handler类中手动处理此类错误,否则您将获得默认的404 Laravel页面。

答案 1 :(得分:2)

$business->users()
    ->where('userable_id', $business->id)
    ->where('userable_type', 'App\Models\Business')
    ->first()->update(['first_name' => 'New']);

答案 2 :(得分:0)

->first()方法之后立即访问方法/字段是非常糟糕的做法。

如果未找到模型,则PHP会引发错误,因为您正尝试使用null值访问方法/属性。

改为使用

$user = $business->users()
    ->where('userable_id', $business->id)
    ->where('userable_type', 'App\Models\Business')
    ->first();
$user->first_name = 'New';
$user->save();

// or, if 'first_name' is in your model $fillable array
$user->update(['first_name' => 'new' ]);