在Laravel中导入一个Csv文件后,如果数据库存在则更新一条记录?

Update a record of DB if it exists after importing a Csv file in Laravel?

我正在使用 Maatwebsite\Excel 导入一个 csv 文件以将新用户存储在数据库中。如果我已经在数据库中创建了一条记录,其中包含它创建的相同数据并出错。如果记录存在,我该如何更新?

我的导入 class 是:

class UsersImport implements ToModel, WithCustomCsvSettings, WithHeadingRow
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new User([
            'firstname' => $row['firstname'],
            'lastname' => $row['lastname'],
            'email' => $row['email'],
            'password' => $row['pass'],
            'created_at' => $row['registered'],
        ]);
    }

    public function getCsvSettings(): array
    {
        return [
            'delimiter' => ","
        ];
    }
}

您应该实现 WithUpserts 接口。您还需要指定哪个字段应该是唯一的,如果它存在,它将更新记录,否则它将创建新的记录。

假设您的唯一列是电子邮件,将您的代码更改为以下内容:

class UsersImport implements ToModel, WithCustomCsvSettings, WithHeadingRow, WithUpserts
{
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function model(array $row)
    {
        return new User([
            'firstname' => $row['firstname'],
            'lastname' => $row['lastname'],
            'email' => $row['email'],
            'password' => $row['pass'],
            'created_at' => $row['registered'],
        ]);
    }

    public function getCsvSettings(): array
    {
        return [
            'delimiter' => ","
        ];
    }

    public function uniqueBy()
    {
        return 'email';
    }
}