php Laravel使用Validator Data自动更新模型?

jv4diomz  于 12个月前  发布在  PHP
关注(0)|答案(3)|浏览(81)

我想知道是否可以用验证器数据更新/保存模型?我试过谷歌搜索,似乎找不到任何东西。
我只是想做这样的事

$validator = Validator::make(request()->all(), [
        'first_name' => ['required', 'string', 'max:255'],
        'last_name' => ['required', 'string', 'max:255'],
        'address_line_1' => ['required', 'string', 'max:255'],
        'address_line_2' => ['required', 'string', 'max:255'],
        'postcode' => ['required', 'string', 'max:255'],
        'city' => ['required', 'string', 'max:255'],
        'county' => ['required', 'string', 'max:255'],
    ]);

    $address = $validator->getData();
    $address->save();

而不是一个接一个地设置所有变量然后保存?

scyqe7ek

scyqe7ek1#

由于getData()返回一个关联数组,因此可以使用update方法:

$validator = Validator::make(request()->all(), [
    'first_name' => ['required', 'string', 'max:255'],
    'last_name' => ['required', 'string', 'max:255'],
    'address_line_1' => ['required', 'string', 'max:255'],
    'address_line_2' => ['required', 'string', 'max:255'],
    'postcode' => ['required', 'string', 'max:255'],
    'city' => ['required', 'string', 'max:255'],
    'county' => ['required', 'string', 'max:255'],
]);

$address->update($validator->getData());

或者(在我看来),您可以使用requestvalidate方法来返回已验证的数据(如果验证成功)。

$address->update(request()->validate([
    'first_name' => ['required', 'string', 'max:255'],
    'last_name' => ['required', 'string', 'max:255'],
    'address_line_1' => ['required', 'string', 'max:255'],
    'address_line_2' => ['required', 'string', 'max:255'],
    'postcode' => ['required', 'string', 'max:255'],
    'city' => ['required', 'string', 'max:255'],
    'county' => ['required', 'string', 'max:255'],
]));

请注意(取决于您使用的Laravel版本),为了执行这些类型的操作,您可能必须在Model中禁用这些字段的保护:

class ... extends Model{
     protected $guarded = [];
     // or
     protected $fillable = [/*list of attributes*/]
}
mec1mxoz

mec1mxoz2#

如果你想的话你可以这么做
创建

$address = Address::create($request->all());

更新

$address = Address::update($request->all());

这将做你的工作,因为你想。
但是你需要小心mass assignment(不要忘记阅读下面的NOTE
如果你执行mass赋值(我上面写的解决方案),你不应该冒任何风险。因此,在模型中相应地设置fillableguarded属性。
你可以在这里详细阅读。https://laravel.com/docs/7.x/eloquent#mass-assignment

**注意:**但在某些情况下,fillable检查不适用于update

它将执行可填充检查

Model::update([..]);

在这种情况下,它不会执行检查。

Model::where('attribute', 'some value')->update([..]);

这些参考文献对此行为有详细的解释。
https://github.com/laravel/framework/issues/16447
Laravel Eloquent - $fillable is not working?

fwzugrvs

fwzugrvs3#

在2023年,我发现这种方式更加简洁和简单:

class StoreEntityRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'min:2'],
            'age' => ['required', 'number'],
        ];
    }
}
class EntityController extends Controller
{
    public function store(StoreEntityRequest $request, Entity $entity){
        $entity->update(
            $request->safe()->toArray()
        );
    }
}

相关问题