Laravel обновление или создание данных


у меня есть command из laravel который читает файл csv и вызывает функцию, которая для каждого элемента смотрит, существует ли элемент (обновит его), и если он не существует, он создаст его.

command это:

    public function handle()
{
    if (false === file_exists($this->argument('file'))) {
        throw new FileNotFoundException('File not found');
    }

    $this->file = $this->argument('file');
    $this->comment('--- Start reading CSV file ---');

    $handle = fopen($this->file, "r");

    $outPutCsvLine = [];
    while ($csvLine = fgetcsv($handle, 1000, ',')) {
    $data = [
           'name' => $csvLine[0];
           'category_id' => $this->searchCategoryByName($csvLine[1])
    ];

        $this->createOrUpdateAliment($data);
    }


}

Теперь у меня есть сомнения с функцией, которая создаст этот элемент, на данный момент у меня есть этот код:

    private function createOrUpdateAliment($data) {
    $aliment = App\Aliment::where('name',$name)->first();

if (null === $aliment) {
       $aliment->create($data);
}
    else {
       .... // actualizar
   }
}

я сомневаюсь, как сделать" update " этого объекта.

Спасибо

Author: DjCrazy, 2019-03-21

2 answers

Я рекомендую вам использовать метод Eloquent updateOrCreate:

public function handle()
{
    if (false === file_exists($this->argument('file'))) {
        throw new FileNotFoundException('File not found');
    }

    $this->file = $this->argument('file');
    $this->comment('--- Start reading CSV file ---');

    $handle = fopen($this->file, "r");

    $outPutCsvLine = [];
    while ($csvLine = fgetcsv($handle, 1000, ',')) {
    $data = [
           'name' => $csvLine[0];
           'category_id' => $this->searchCategoryByName($csvLine[1])
    ];

    /**
     * usando updateOrCreate
     * si encuentra un modelo que coincida con 'name': lo actualiza
     * de lo contrario lo crea usando lo que pasamos en $data
     */
    $updateOrCreate = App\Aliment::updateOrCreate(
        ['name' => $csvLine[0]],
        $data
    );

    }

}

Link официальная документация: https://laravel.com/docs/5.8/eloquent

 2
Author: varTob, 2019-03-21 14:55:07

Основываясь на данных, которые Вы нам показываете, любой из этих двух способов должен обновить запись для вас:

private function createOrUpdateAliment($data) {
    $aliment = App\Aliment::where('name',$name)->first();

    if (null === $aliment) {
       $aliment->create($data);
    }
    else {
       //$aliment->update($data);

       //$aliment->category_id = $data['category_id'];
       //$aliment->save();
   }
}
 2
Author: Francisco Garrido, 2019-03-21 12:53:18