diff --git a/lib/Models/SubscriberCustomField.php b/lib/Models/SubscriberCustomField.php index 3754b84ad0..c9488566b3 100644 --- a/lib/Models/SubscriberCustomField.php +++ b/lib/Models/SubscriberCustomField.php @@ -52,7 +52,6 @@ class SubscriberCustomField extends Model { } static function createMultiple($values) { - $values = array_map('array_values', $values); return self::rawExecute( 'INSERT IGNORE INTO `' . self::$_table . '` ' . '(custom_field_id, subscriber_id, value) ' . @@ -67,8 +66,6 @@ class SubscriberCustomField extends Model { } static function updateMultiple($values) { - self::createMultiple($values); - $values = array_map('array_values', $values); self::rawExecute( 'UPDATE `' . self::$_table . '` ' . 'SET value = ' . @@ -92,4 +89,4 @@ class SubscriberCustomField extends Model { $relations = self::where('subscriber_id', $subscriber->id); return $relations->deleteMany(); } -} +} \ No newline at end of file diff --git a/lib/Subscribers/ImportExport/Import/Import.php b/lib/Subscribers/ImportExport/Import/Import.php index d98afb093e..1e61ad54f8 100644 --- a/lib/Subscribers/ImportExport/Import/Import.php +++ b/lib/Subscribers/ImportExport/Import/Import.php @@ -210,10 +210,12 @@ class Import { ); $existing_subscribers = array_map(function($subscriber) use ($new_records) { - return array_values( // reindex array + return array_filter( + array_values( // reindex array array_map(function($index, $data) use ($new_records) { if(!in_array($index, $new_records)) return $data; }, array_keys($subscriber), $subscriber) + ) ); }, $subscribers_data); return array( @@ -359,7 +361,7 @@ class Import { $query->where('created_at', $this->created_at); $result = Helpers::arrayColumn( $query->findArray(), - 'email', 'id' + 'id' ); if($subscriber_custom_fields) { $this->createOrUpdateCustomFields( @@ -378,37 +380,36 @@ class Import { function createOrUpdateCustomFields( $action, - $db_subscribers, + $db_subscribers_ids, $subscribers_data, - $subscriber_custom_fields + $subscriber_custom_fields_ids ) { // check if custom fields exist in the database - $subscriber_custom_fields = Helpers::flattenArray( - CustomField::whereIn('id', $subscriber_custom_fields)->select('id')->findArray() + $subscriber_custom_fields_ids = Helpers::flattenArray( + CustomField::whereIn('id', $subscriber_custom_fields_ids) + ->select('id') + ->findArray() ); - if(!$subscriber_custom_fields) return; - $subscribers = array_map(function($column) use ($db_subscribers, $subscribers_data) { - $count = range(0, count($subscribers_data[$column]) - 1); - return array_filter( // remove null values - array_map(function($index, $value) use ($db_subscribers, $subscribers_data, $column) { - $subscriber_id = array_search( - $subscribers_data['email'][$index], - $db_subscribers - ); - // if subscriber does not not exist, return a null value - return ($subscriber_id) ? - array($column, $subscriber_id, $value) : - null; - }, $count, $subscribers_data[$column]) - ); - }, $subscriber_custom_fields); - $subscribers[0] = array_filter($subscribers[0]); - foreach(array_chunk($subscribers[0], 200) as $data) { - if($action === 'create') { - SubscriberCustomField::createMultiple( - $data + if(!$subscriber_custom_fields_ids) return; + $subscriber_custom_fields_data = array(); + foreach($subscribers_data as $field_id => $subscriber_data) { + // exclude non-custom fields + if(!is_int($field_id)) continue; + $subscriber_index = 0; + foreach($subscriber_data as $value) { + // assemble an array: custom_field_id, subscriber_id, value + $subscriber_custom_fields_data[] = array( + (int)$field_id, + (int)$db_subscribers_ids[$subscriber_index], + $value ); + $subscriber_index++; } + } + foreach(array_chunk($subscriber_custom_fields_data, 200) as $data) { + SubscriberCustomField::createMultiple( + $data + ); if($action === 'update') { SubscriberCustomField::updateMultiple( $data diff --git a/tests/unit/Models/SubscriberCustomFieldTest.php b/tests/unit/Models/SubscriberCustomFieldTest.php index b440339b08..f341dc3433 100644 --- a/tests/unit/Models/SubscriberCustomFieldTest.php +++ b/tests/unit/Models/SubscriberCustomFieldTest.php @@ -5,36 +5,44 @@ class SubscriberCustomFieldTest extends MailPoetTest { function __construct() { $this->data = array( array( - 'custom_field_id' => 10, - 'subscriber_id' => 12, - 'value' => 'Test 1' + 10, // custom_field_id + 12, // subscriber_id + 'Test 1' // value ), array( - 'custom_field_id' => 10, - 'subscriber_id' => 13, - 'value' => 'Test 2' + 10, // custom_field_id + 13, // subscriber_id + 'Test 2' // value ) ); } function testItCanBeCreated() { $subscriberCustomField = SubscriberCustomField::create(); - $subscriberCustomField->hydrate($this->data[0]); + $subscriberCustomField->custom_field_id = $this->data[0][0]; + $subscriberCustomField->subscriber_id = $this->data[0][1]; + $subscriberCustomField->value = $this->data[0][2]; $subscriberCustomField->save(); - expect($subscriberCustomField->id() > 0)->true(); + expect($subscriberCustomField->id())->greaterOrEquals(1); expect($subscriberCustomField->getErrors())->false(); } - function testItCanCreateOrUpdateMultipleRecords() { + function testItCanCreateMultipleRecords() { SubscriberCustomField::createMultiple($this->data); $records = SubscriberCustomField::findArray(); expect(count($records))->equals(2); - expect($records[1]['value'])->equals($this->data[1]['value']); - $updatedData = $this->data; - $updatedData[0]['value'] = 'updated'; - SubscriberCustomField::updateMultiple($updatedData); + expect($records[0]['value'])->equals('Test 1'); + expect($records[1]['value'])->equals('Test 2'); + } + + function testItCanUpdateMultipleRecords() { + SubscriberCustomField::createMultiple($this->data); + $updated_data = $this->data; + $updated_data[0][2] = 'Updated'; + SubscriberCustomField::updateMultiple($updated_data); $records = SubscriberCustomField::findArray(); - expect($records[0]['value'])->equals($updatedData[0]['value']); + expect($records[0]['value'])->equals('Updated'); + expect($records[1]['value'])->equals('Test 2'); } function _after() { diff --git a/tests/unit/Subscribers/ImportExport/Import/ImportTest.php b/tests/unit/Subscribers/ImportExport/Import/ImportTest.php index 640cb33f4a..28b0731061 100644 --- a/tests/unit/Subscribers/ImportExport/Import/ImportTest.php +++ b/tests/unit/Subscribers/ImportExport/Import/ImportTest.php @@ -279,18 +279,18 @@ class ImportTest extends MailPoetTest { $this->subscriber_fields, false ); - $db_subscribers = Helpers::arrayColumn( + $db_subscribers_ids = Helpers::arrayColumn( Subscriber::selectMany( array( 'id', 'email' )) ->findArray(), - 'email', 'id' + 'id' ); $this->import->createOrUpdateCustomFields( 'create', - $db_subscribers, + $db_subscribers_ids, $subscribers_data, $this->subscriber_custom_fields ); @@ -301,7 +301,7 @@ class ImportTest extends MailPoetTest { $subscribers_data[$custom_field][1] = 'Rio'; $this->import->createOrUpdateCustomFields( 'update', - $db_subscribers, + $db_subscribers_ids, $subscribers_data, $this->subscriber_custom_fields );