2013-12-23 2 views
2

Как есть firstOrCreate() в Laravel Eloquent, мне было интересно, существует ли функция, которая может либо создать запись, либо если она существует, обновите текущий?Создать или обновить - Laravel 4.1

Или мне нужно написать свой собственный?

Я не смог найти что-либо в документации, но это не первый раз, я нашел материал о Eloquent в другом месте, чем документы.

ответ

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 равно нулю, то новый экземпляр будет создан и сохранен, в противном случае он будет обновляться.

Смежные вопросы