Skip to content

Commit fe7d450

Browse files
committed
fixed recursive merge
1 parent a6b848d commit fe7d450

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

src/helper/ArrayMerge.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace indigerd\embedded\helper;
4+
5+
class ArrayMerge
6+
{
7+
public static function isAssoc($val) {
8+
if (!\is_array($val)) {
9+
return false;
10+
}
11+
$assoc = false;
12+
foreach ($val as $k => $v) {
13+
if (!\is_int($k)) {
14+
$assoc = true;
15+
break;
16+
}
17+
}
18+
return $assoc;
19+
}
20+
21+
public static function mergeRecursive($array1, $array2)
22+
{
23+
foreach($array2 as $key=>$val) {
24+
if(isset($array1[$key])) {
25+
if(self::isAssoc($val)) {
26+
$array1[$key] = self::mergeRecursive($array1[$key], $val);
27+
} else {
28+
$array1[$key] = $val;
29+
}
30+
} else {
31+
$array1[$key] = $val;
32+
}
33+
}
34+
return $array1;
35+
}
36+
}

src/model/ActiveRecord.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace indigerd\embedded\model;
44

5-
use yii\helpers\ArrayHelper;
65
use yii\db\ActiveRecord as BaseModel;
76
use indigerd\embedded\behavior\HydrateCollectionBehavior;
7+
use indigerd\embedded\helper\ArrayMerge;
88

99
class ActiveRecord extends BaseModel
1010
{
@@ -24,7 +24,7 @@ public function setAttributes($values, $safeOnly = true)
2424
unset($oldValues[$behavior->attribute]);
2525
}
2626
}
27-
$values = ArrayHelper::merge($oldValues, $values);
27+
$values = ArrayMerge::mergeRecursive($oldValues, $values);
2828
parent::setAttributes($values, $safeOnly);
2929
$this->trigger(Model::EVENT_AFTER_POPULATE);
3030
}

src/model/Model.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace indigerd\embedded\model;
44

5-
use yii\helpers\ArrayHelper;
65
use yii\base\Model as BaseModel;
76
use indigerd\embedded\behavior\HydrateCollectionBehavior;
7+
use indigerd\embedded\helper\ArrayMerge;
88

99
class Model extends BaseModel
1010
{
@@ -28,7 +28,7 @@ public function setAttributes($values, $safeOnly = true)
2828
unset($oldValues[$behavior->attribute]);
2929
}
3030
}
31-
$values = ArrayHelper::merge($oldValues, $values);
31+
$values = ArrayMerge::mergeRecursive($oldValues, $values);
3232
parent::setAttributes($values, $safeOnly);
3333
$this->trigger(Model::EVENT_AFTER_POPULATE);
3434
}

src/model/mongodb/ActiveRecord.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
namespace indigerd\embedded\model\mongodb;
44

5-
use yii\helpers\ArrayHelper;
5+
use MongoDB\BSON\ObjectId;
66
use yii\mongodb\ActiveRecord as BaseModel;
77
use indigerd\embedded\model\Model;
88
use indigerd\embedded\behavior\HydrateCollectionBehavior;
9+
use indigerd\embedded\helper\ArrayMerge;
910

1011
class ActiveRecord extends BaseModel
1112
{
@@ -15,6 +16,9 @@ public function setAttributes($values, $safeOnly = true)
1516
$keys = [];
1617
foreach ($values as $key => $value) {
1718
if ($this->hasAttribute($key)) {
19+
if ($this->getAttribute($key) instanceof ObjectId) {
20+
continue;
21+
}
1822
$keys[] = $key;
1923
}
2024
}
@@ -25,7 +29,7 @@ public function setAttributes($values, $safeOnly = true)
2529
unset($oldValues[$behavior->attribute]);
2630
}
2731
}
28-
$values = ArrayHelper::merge($oldValues, $values);
32+
$values = ArrayMerge::mergeRecursive($oldValues, $values);
2933
parent::setAttributes($values, $safeOnly);
3034
$this->trigger(Model::EVENT_AFTER_POPULATE);
3135
}

0 commit comments

Comments
 (0)