Оптимизировать foreach l oop in laravel - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужна массовая вставка в таблицу подписчиков и в таблицу полей подписчиков, в которую поступают данные из файла CSV.

Таблице подписчиков нужна только таблица электронной почты, а в таблице полей подписчика нужны идентификатор абонента из таблицы подписчиков, идентификатор поля из таблицы полей и другие поля CSV.

Итак, я пишу этот код для этой работы, и здесь много foreach l oop, поэтому выполнение при выполнении большого 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);

1 Ответ

0 голосов
/ 18 февраля 2020
//set all email in a array
$emails = array();
foreach ($data as $item) {
    array_push($emails, $item['email']);
}

$exists_mail = array();

$subscribers = Subscriber::whereIn('email', $emails)
->where('mail_list_id', $this->id)
->pluck('email')
->toArray();

//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(!in_array($item['email'], $subscribers)){
        $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();

$fieldBatch = array();

foreach ($totalSubscriber as $index => $subscriber) {
    $total_field[$index]['subscriber_id'] =  $subscriber['id'];
}


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);

Я удаляю код ниже и использую pluck

$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;
}

Мы оптимизируем и можем удалить код ниже

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);

}}

Нравится:

//bulk insert in subscriber fields table
$totalSubscriber = Subscriber::select('id')
->whereIn('uid', $subscriber_uid)
->get()
->toArray();

$fieldBatch = array();

foreach ($totalSubscriber as $index => $subscriber) {
    //$total_field[$index]['subscriber_id'] =  $subscriber['id'];
    foreach ($fields as $field) {
        $fieldColumn['subscriber_id'] = $subscriber['id'];
        $fieldColumn['field_id']      = $field['id'];
        $fieldColumn['value']         = $item[Str::lower($field['tag'])];
        array_push($fieldBatch, $fieldColumn);
    }
}

Но я не знаю, какой тип данных в массиве $ fields Если вы предоставите массив полей, я постараюсь более оптимизировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...