2015-09-20 4 views
-1

Верьте или нет. Мне очень сложно понять это, я пытаюсь сохранить модель, и я продолжаю получать дубликат записи. У меня есть таблица с 2-мя колонны id и data, id является не столбца автоматического приращения и является первичным ключом, вот моя модельСохраните модель в Laravel 5

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class TestResult extends Model { 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'results'; 
    protected $fillable = ['id', 'data']; 
    protected $guarded = []; 
    public $incrementing = false; 
    public $timestamps = false; 

} 

Вот моего контроллер

public function postIndex() { 
    $id = ... 

    $result = new TestResult(['id' => $id]); 
    $result->results = Input::get("results"); 
    $result->save(); 

    return redirect()->action('[email protected]'); 
} 

Я попытался просто о все, чтобы заставить это работать с 1 запросом, и я не мог. Я даже попытался построить свой собственный запрос с использованием объекта laravel DB и имел ужасно неприятное время. На данный момент я начинаю развивать отношение к структуре, поскольку такая простая работа занимает очень много времени.

Единственное, что я могу получить для работы, - это установить $result->exists = true, что требует 2 запросов, чтобы определить, так ли это или нет.

Может любой дайте мне знать, как я могу это сделать в одном запросе. Очень благодарен!

+0

Ну ... если $ id является статическим и первичным ключом в базе данных, очевидно, что это будет дубликат, если я что-то не упустил. – Devon

+0

@Devon id - это значение, которое я получаю от внешнего API, необходимо обновить запись, если она уже существует, jusst, как я думал, что метод 'save()' сделал. –

ответ

1

Если $id существует, используя $result = new TestResult как в вставка приведет к дублированию записи.

Обычный способ сделать обновление использует $result = TestResult::find($id).

A заменить (что, я считаю, это то, что вы хотите) можно сделать с помощью $result = TestResult::firstOrNew(['id' => $id]);. Это будут два SQL-запроса, которые выглядят так, как вы хотели этого избежать, но они должны быть быстрыми на первичном ключе.

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