2013-12-23 140 views
2

由于在Laravel Eloquent中有firstOrCreate() ,我想知道是否有可以创建记录的函数或者是否存在,更新当前的记录?创建或更新 - Laravel 4.1

或者我需要自己写一个吗?

我在文档中找不到任何东西,但这不是第一次,我发现了有关其他地方的文章,而不是文档。

回答

2

您需要在更新之前找到模型,对吧?你不能仅仅因为在这个(新的)属性的数据库中没有模型而仅仅调用Model::firstOrUpdate($newAttributes)

I.e。您必须知道某个模型的独特属性,例如id。在此之后,您可以获取它并使用新属性调用update方法:Model::firstOrNew(['id' => $id])->update($newAttributes)$id这里可以是null,在这种情况下,新模型将被实例化(但不保存)。你可以看到,这段代码非常短,但是当然,如​​果你愿意的话,你可以把它放到方法中去。

+0

ahh,我明白了,谢谢 – Jazerix

0

更直接和DRY会是下面的方法添加到您的BaseModel:

public function write($input, $key = 'id') 
{ 
    // Instantiate new OR existing object 
    if (! empty($input[$key])) 
     $resource = $this->findOrFail($input[$key]); 
    else 
     $resource = $this; // Use a clone to prevent overwriting the same object in case of recursion 

    // Fill object with user input using Mass Assignment 
    $resource->fill($input); 

    // Save data to db 
    if (! $resource->save()) 
     App::abort(500, 'Could not save resource'); 

    return $resource; 
} 
+0

这是不好做的模型类中的http相关 – neoascetic

+0

然后把它放在你的BaseController上... –

4

你几乎把它命名。 :)

$instance = Model::updateOrCreate(['id' => $id], $newAttributes); 

如果$id为null,则一个新的实例将被创建并保存,否则将被更新。