【问题标题】:Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::update() must be of the type array, object given传递给 Illuminate\Database\Eloquent\Relations\HasOneOrMany::update() 的参数 1 必须是数组类型,对象给定
【发布时间】:2017-05-20 14:16:43
【问题描述】:

我想更新数据库中的数据 我有控制器

public function update(Identity $identity, Request $request)
{
  $data = new Identity();
  $data->date  = $request['date'];
  $data->code   = $request['code'];
  $data->name   = $request['name'];
  $request->user()->identity()->update($data);
  Session::flash('flash_message', 'Update success.');
  return redirect('identity.index');
}

模型标识

public function user()
{
// Each data is owned by only one user
return $this->belongsTo('App\User');
}

模型用户

public function identity()
{
// Each user will have a lot of data
return $this->hasMany('App\Identity');
}

我发现一个错误:传递给 Illuminate\Database\Eloquent\Relations\HasOneOrMany::update() 的参数 1 必须是数组类型,给定对象。

【问题讨论】:

    标签: php laravel model-view-controller


    【解决方案1】:

    您已经拥有带有路由模型绑定的身份模型。您可以执行以下操作之一。

    public function update(Identity $identity, Request $request)
    {
        $identity->date = $request['date'];
        $identity->code = $request['code'];
        $identity->name = $request['name'];
        $identity->save();
    
        Session::flash('flash_message', 'Update success.');
        return redirect('identity.index');
    }
    

    或者(确保您在模型中设置了 $fillable 属性以使其正常工作)

    public function update(Identity $identity, Request $request)
    {
        $identity->update([
            'date' => $request['date'],
            'code' => $request['code'],
            'name' => $request['name'],
        ]);
    
        Session::flash('flash_message', 'Update success.');
        return redirect('identity.index');
    }
    

    【讨论】:

      【解决方案2】:

      这一行

      $data = new Identity();
      

      创建一个对象。在此之下,您正在设置其属性。相反,看起来您可以将属性直接传递给函数:

      public function update(Identity $identity, Request $request)
      {
        $request->user()->identity()->update(array($request));
        ...
      }
      

      当然,您可能还想将您的请求限制在需要的范围内:

      public function update(Identity $identity, Request $request)
      {
        $params = array_intersect_key(array($request), array_flip(['date', 'code', 'name']))
        $request->user()->identity()->update($params);
        ...
      }
      

      【讨论】:

      • 您的意思是使用$request->all() 而不是$request?你也可以这样做$params = request()->intersect('date', 'code', 'name')
      • @Sandeesh 也许 :) 我不熟悉 Laravel。我是从纯对象/数组的角度来回答的。
      • @MattS 你能帮我解决这个问题吗[stackoverflow.com/questions/44540484/…
      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2018-05-28
      • 2020-02-23
      • 1970-01-01
      • 2017-12-17
      • 2018-04-19
      • 2019-08-23
      相关资源
      最近更新 更多