Laravel仅考虑请求中的必需列,并忽略任何其他键值(如果存在)

Vra*_*shi 4 php laravel laravel-5 laravel-5.4

在Laravel API中,我传递了带有少量其他key:values的请求输入json,这些是我在API函数的业务逻辑的其他部分中所需要的。当我将Controller函数$request->all()的形式参数的array传递Request $request给Model函数并将其直接传递给Eloquent create()函数时,如下所示:

StatusModel::create($request);
Run Code Online (Sandbox Code Playgroud)

我得到错误,

SQLSTATE [42S22]:找不到列:1054“字段列表”中的未知列“ app”(SQL:更新tbl_pointsteam_id= 4,tour_id= 10, match_id= 254,win= 0,loss= 1,tie= 1,n_r= 1,pt= 1,nrr= 1 app= 3,其中(team_id= 4且tour_id= 10且 match_id= 254))。

我想按原样传递输入请求数组,并希望laravel忽略数据库中不存在的数组中的列名称键。EG:以下是我的输入json,其中“ app”:3是表中不存在的额外键值。

{
"team_id": 4,
"tour_id": 10,
"match_id": 254,
"win": 0,
"loss": 1,
"tie": 1,
"n_r": 1,
"pt": 1,
"nrr": 1,
"app": 3
}
Run Code Online (Sandbox Code Playgroud)

我的模型代码

<?php

namespace App\Models\BaseModels;
use Illuminate\Database\Eloquent\Model;

class TablePoints extends Model
{   
    protected $table = 'tbl_points';    
    protected $fillable = ['team_id','tour_id','match_id','win','loss','tie','n_r','pt','nrr'];    
    public $timestamps = false;
}
Run Code Online (Sandbox Code Playgroud)

在dd($ request-> all())上,我得到以下输出:

array:10 [
  "team_id" => 4
  "tour_id" => 10
  "match_id" => 254
  "win" => 0
  "loss" => 1
  "tie" => 1
  "n_r" => 1
  "pt" => 1
  "nrr" => 1
  "app" => 3
]
Run Code Online (Sandbox Code Playgroud)

如何通过使代码忽略额外的键值对来避免发生此类错误。

注意:我不想创建一个新数组并从请求数组中复制所需键的值并使用它。还有其他解决方案吗?

Lae*_*rte 7

您应该使用except功能。尝试这个:

StatusModel::create($request->except('app'));
Run Code Online (Sandbox Code Playgroud)

这将返回除字段以外的所有字段app

您也可以将其与数组一起使用以忽略多个字段。例如:

$request->except(['field1', 'field2']);
Run Code Online (Sandbox Code Playgroud)

如果您需要排除所有不相关的数据,则可以使用如下代码破解:

在StatusModel中:

public function getFillable()
{
    return $this->fillable;
}
Run Code Online (Sandbox Code Playgroud)

然后在Controller中,使用only方法过滤请求中的属性:

$statusModel = new StatusModel();
$fields = $request->only($statusModel->getFillable());
$statusModel->fill($fields);
$statusModel->save();
Run Code Online (Sandbox Code Playgroud)