Laravel在没有两个查询的情况下创建或更新

mpe*_*pen 12 php laravel laravel-4

我正在尝试使用一个表单进行创建和更新.两种操作都通过此方法保存:

public function store() {
    $data = Input::all();
    $data['company_id'] = Auth::user()->company_id;
    $validator = Validator::make($data, Feature::$rules);

    if($validator->fails()) {
        return Redirect::back()->withErrors($validator)->withInput();
    }

    Feature::firstOrNew(['id' => Input::get('id')])->update($data);

    return Redirect::route('features.index');
}
Run Code Online (Sandbox Code Playgroud)

我该如何重写这一行:

Feature::firstOrNew(['id' => Input::get('id')])->update($data);
Run Code Online (Sandbox Code Playgroud)

所以它不首先从数据库中获取对象?没有必要; 我没有做任何事情.它应该发出一个INSERTif Input::get('id')设置,或者UPDATE如果不设置.

Kei*_*day 32

这是我使用的:

Model::updateOrCreate(
   ['primary_key' => 8],
   ['field' => 'value', 'another_field' => 'another value']
);
Run Code Online (Sandbox Code Playgroud)

第二个参数是要保存的模型的数据数组.


Vla*_*sny 10

如果您的模型中所有字段都没有防范,我认为您可以这样做:

$feature = new Feature($data);
$feature->exists = Input::has('id');
$feature->save();
Run Code Online (Sandbox Code Playgroud)

如果你有一些守卫的领域,那么你可以先保护它:

$feature = new Feature();
$feature->unguard();
$feature->fill($data);
$feature->exists = Input::has('id');
$feature->reguard();
$feature->save();
Run Code Online (Sandbox Code Playgroud)

reguard(),如果你没有做任何其他与该模型实际上不需要调用.


小智 6

我曾经遇到过这个问题,并在Laravel上创建了一个可以使用的拉取请求.请尝试下面的代码.你基本上需要的方法是findOrNew.

public function store($id=0)
{
    $user = User::findOrNew($id);
    $data = Input::all();

    if (!$user->validate($data)) {
        return Redirect::back()->withInput()->withErrors($user->errors);
    }

    $user->fill($data);
    $user->save();
    return Redirect::to('/')->with('message','Record successfully saved!');
}
Run Code Online (Sandbox Code Playgroud)

我的模型使用自我验证,但您可以像现在一样创建自己的验证.


Maj*_*bib 5

根据主键ID查找或新建

$data = Input::all();
$user = User::findOrNew($id);  // if exist then update else insert
$user->name= $data['user_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)

基于非主要单一字段的First或New

$user = User::firstOrNew(['field' => $data['value'] ]);
$user->name= $data['user_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)

First或New基于非主键字段

$user = User::firstOrNew([
                     'field1'=>$data['value1'],
                     'field2'=>$data['value2']
                     ]);
$user->name= $data['user_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)