【问题标题】:Laravel 7 FormRequest update without readonly fieldLaravel 7 FormRequest 更新没有只读字段
【发布时间】:2020-09-04 14:34:04
【问题描述】:

我有一个模型,创建后您无法修改某些数据。考虑到这一点,当我更新时,我不会验证这些字段,也不会在更新方法中引用它们。

问题是,如果我使用->update(),它根本不起作用,没有任何东西被提交到数据库,我使用->save() 它会触发INSERT INTO 而不是UPDATE

我不明白到底发生了什么。谢谢你。

型号

class Profile extends Model
{
    use Userstamps;
    use SoftDeletes;

    protected $fillable = [
        'name',
        'street_address',
        'street_address2',
        'city',
        'province',
        'postal_code',
        'phone',
        'email',
        'url',
        'description',
        'logo_path',
    ];

    protected $guarded = [
        'active',
        'created_by',
        'modified_by',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user ()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * @return bool
     */
    public function canModify ()
    {
        return ((auth()->user()->role === 'admin') || ($this->created_by === auth()->user()->id));
    }

}

表单请求

class UpdateProfile extends FormRequest
{
    public function rules ()
    {
        $rules = [
            'name'            => 'required',
            'street_address'  => 'required',
            'street_address2' => 'nullable',
            'city'            => 'required',
            'province'        => 'required',
            'postal_code'     => 'required|regex:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]( )?\d[ABCEGHJKLMNPRSTVWXYZ]\d$/|size:7',
            'phone'           => 'nullable|regex:/^1\s\(\d{3}\)\s\d{3}-\d{4}$/|size:16',
            'email'           => 'required|email:rfc,dns,spoof|unique:App\User,email',
            'url'             => 'nullable|url',
            'description'     => 'nullable',
            'logo_path'       => 'nullable',
        ];

        return $rules;
    }
}

控制器

class ProfileController extends Controller
{
    public function update (Profile $profile, UpdateProfile $request)
    {
        if (!$profile->canModify()) {
            return redirect('profiles')
                ->with('error.message', __('app.restricted', [
                    'title' => request("name"),
                ]));
        }

        $update                     = $request->validated();
        $profile['name']            = $update['name'];
        $profile['street_address']  = $update['street_address'];
        $profile['street_address2'] = $update['street_address2'];
        $profile['city']            = $update['city'];
        $profile['province']        = $update['province'];
        $profile['postal_code']     = $update['postal_code'];
        $profile['phone']           = $update['phone'];
        $profile['email']           = $update['email'];
        $profile['url']             = $update['url'];
        $profile['description']     = $update['description'];
        if (isset($update['logo_path'])) {
            $profile['logo_path'] = $request->file('logo_path')->store('uploads/logos');
        }

        $profile->update();

        return redirect()
            ->route('profiles', $profile)
            ->with('saved.message', __('profile.message.edited', [
                'title' => $profile->name,
            ]));
    }
}

路线

Route::get('/profile/{profile}/edit', 'ProfileController@edit')
    ->name('profile.edit')
    ->middleware('auth');

Route::put('/profile/update', 'ProfileController@update')
    ->name('profile.update')
    ->middleware('auth');

【问题讨论】:

  • 你能分享一下你的路线调用吗?
  • 我添加了路线。

标签: laravel eloquent laravel-7


【解决方案1】:

Mass Updates

update 方法需要一个列和值对数组,表示应该更新的列。

既然您说“当我更新时,我不会验证这些字段,也不会在更新方法中引用它们”,您已经在 $update 变量中拥有该数组,我认为您可以这样做像这样:

public function update (Profile $profile, UpdateProfile $request)
{
    if (!$profile->canModify()) {
        return redirect('profiles')
            ->with('error.message', __('app.restricted', [
                'title' => request("name"),
            ]));
    }

    $update = $request->validated();
    if (isset($update['logo_path'])) {
        $update['logo_path'] = $request->file('logo_path')->store('uploads/logos');
    }

    $profile->update($update);

    return redirect()
        ->route('profiles', $profile)
        ->with('saved.message', __('profile.message.edited', [
            'title' => $profile->name,
        ]));
}

此外,您需要在路由上声明一个参数,以使用模型绑定来更新控制器上的现有记录:

Route::put('/profile/{profile}/update', 'ProfileController@update')
    ->name('profile.update')
    ->middleware('auth');

【讨论】:

  • 谢谢,不知什么原因还是不能工作:(
  • 好的,我明白了,你的路由没有参数,所以你不能在你的控制器上使用模型绑定。你能告诉我们你是如何发送模型ID来更新的吗?也许它的形式是
  • 非常感谢!这是路线!我有 6 个控制器,这是我唯一忘记的一个,哈哈
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多