Мне нужна массовая вставка в таблицу подписчиков и таблицу полей подписчиков, в которой данные поступают из файла CSV.
Таблице подписчиков нужен только адрес электронной почты, а таблице полей подписчиков нужен идентификатор подписчика из таблицы подписчиков, идентификатор поля из таблицы полей и другие поля CSV.
Итак, я пишу этот код для этого задания, и здесь много циклов foreach, поэтому выполнение занимает много времени, когда я вставляю большой файл CSV.
Теперь, можно ли оптимизировать этот код?
Вот мой код:
$emails = array();
foreach ($data as $item) {
array_push($emails, $item['email']);
}
$subscribers = Subscriber::select('email')->whereIn('email', $emails)->where('mail_list_id', $this->id)->get();
//check exists mail in database
$exists_mail = array();
foreach ($subscribers as $item) {
$exists_mail[$item->email] = true;
}
//get subscriber unique key
$subscriber_uid = array();
//get all field value
$total_field = array();
//bulk insert in subscribers table
$subscriberBatch = array();
foreach ($data as $item) {
if (!isset($exists_mail[$item['email']])) {
$column['uid'] = uniqid();
$column['mail_list_id'] = $this->id;
$column['email'] = $item['email'];
$column['status'] = Subscriber::STATUS_SUBSCRIBED;
$column['subscription_type'] = Subscriber::SUBSCRIPTION_TYPE_IMPORTED;
array_push($subscriberBatch, $column);
array_push($subscriber_uid, $column['uid']);
$fieldKey['uid'] = $column['uid'];
foreach ($fields as $field) {
$fieldKey[Str::lower($field['tag'])] = $item[Str::lower($field['tag'])];
}
array_push($total_field, $fieldKey);
}
}
Subscriber::insert($subscriberBatch);
//bulk insert in subscriber fields table
$totalSubscriber = Subscriber::select('id')->whereIn('uid', $subscriber_uid)->get()->toArray();
foreach ($totalSubscriber as $index => $subscriber) {
$total_field[$index]['subscriber_id'] = $subscriber['id'];
}
$fieldBatch = array();
foreach ($total_field as $item) {
foreach ($fields as $field) {
$fieldColumn['subscriber_id'] = $item['subscriber_id'];
$fieldColumn['field_id'] = $field['id'];
$fieldColumn['value'] = $item[Str::lower($field['tag'])];
array_push($fieldBatch, $fieldColumn);
}
}
SubscriberField::insert($fieldBatch);
Подробнее здесь: https://stackoverflow.com/questions/602 ... in-laravel
Оптимизировать цикл foreach в laravel ⇐ Php
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение