【问题标题】:Laravel 5 mutators only work when I create a record and not when I update a recordLaravel 5 mutators 仅在我创建记录时起作用,而在我更新记录时不起作用
【发布时间】:2015-06-01 03:32:27
【问题描述】:

您好,我创建了一个 mutator,只在我的电话号码上存储数字。这是我的个人资料模型中的代码。

public function setPhoneAttribute($phone)
{
    $this->attributes['phone'] = preg_replace("/[^0-9]/","",$phone);
}

这在我创建新记录时有效,但如果我更新记录,它就不起作用。我的问题是如何在创建和更新时执行 Mutator?

这是我在控制器中更新和创建的方式:

namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Requests\ProfileRequest;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Auth;
use App\Profile;

class ProfileController extends Controller {

    public function create(ProfileRequest $request)
    {
        // Check if the user does not have a profile yet
        if(!Auth::user()->profile()->first()){

            // Save to database
            $saveToDatabase = Auth::user()->profile()->create($request->all()); 

            return $saveToDatabase;
        }
    }

    public function update(Profile $profile, ProfileRequest $request)
    {

        // Save to database
        $saveToDatabase = Auth::user()->profile()->update($request->all());

        return $saveToDatabase;
    }
}

【问题讨论】:

  • 您能否编辑您的问题并添加显示您如何更新/创建记录的代码

标签: php laravel laravel-5 mutators


【解决方案1】:

这是发生了什么:

Auth::user()->profile()->create($request->all()) 在您的关系 (HasOneOrMany) 上调用 create 方法。然后,此方法会创建一个相关模型的新实例。这很重要,因为很明显,属性修改器仅在通过模型创建记录时使用

但是关系对象没有任何update 方法。 (拥有一个也没有意义......)。所以发生的事情是,当您执行Auth::user()->profile()->update($request->all()) 时。 update 调用 get 被代理到查询构建器实例(与关系匹配)。这会导致类似这样的事情被执行:

UPDATE profiles SET foo = 'bar' WHERE [relationship conditions]

根本不使用模型。因此,mutator 不起作用。

相反,您必须在实际相关模型上调用update 方法。您可以通过将关系调用为这样的属性来访问它:

$saveToDatabase = Auth::user()->profile->update($request->all());
//                                    ^^
//                               no parentheses

如果Profile 模型被正确注入,你实际上也可以使用它:

public function update(Profile $profile, ProfileRequest $request)
{
    // Save to database
    $saveToDatabase = $profile->update($request->all());
    return $saveToDatabase;
}

【讨论】:

  • 谢谢!这很有意义。这解决了我的问题: $saveToDatabase = $profile->update($request->all());
【解决方案2】:

使用此代码代替您的代码

$saveToDatabase = Auth::user()->profile->update($request->all());

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2020-05-13
    • 2016-03-19
    相关资源
    最近更新 更多