Я хочу проверить, существует ли телефон в базе данных. Если он существует, строку следует пропустить. Могу ли я сделать это без вызова базы данных каждый раз?
namespace App\Imports;
use App\Models\Friend;
use App\Traits\UniqueId;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class FriendsImport implements ToModel, WithBatchInserts, WithHeadingRow
{
use UniqueId;
public function model(array $row)
{
return new Friend([
'phone' => $row['phone'],
'postcode' => $row['postcode'],
'user_id' => Auth::user()->id,
'unique_id' => $this->generateUniqueNumber(),
]);
}
public function headingRow(): int
{
return 1;
}
public function batchSize(): int
{
return 100;
}
}
Есть много способов "решить" то, что вы хотите, это не значит, что эти способы эффективны... Один из них - хранить числа в
cache
, например redis, чтобы он был доступен супер быстро (это было бы лучшим). Другой процесс должен отправить файлjob
(асинхронно) и позволить ему запрашивать номер построчно, а затем вызывать БД и удалять строку, если она существует. После завершенияjob
отправьте его другомуjob
, который будет обрабатывать добавление строк в вашу таблицу, потому что в файле уже нет существующих телефонов... Это действительно основано на мнении, так что...@matiaslauriti Конечно, есть много способов сделать это, но OP не спрашивает лучший способ, а только как это сделать. Это не делает этот вопрос основанным на мнении.