Commit d620f315 by Qiang Xue

refactored BaseActiveRecord::isPrimaryKey()

parent d5f40b42
...@@ -1234,11 +1234,10 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface ...@@ -1234,11 +1234,10 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface
public static function isPrimaryKey($keys) public static function isPrimaryKey($keys)
{ {
$pks = static::primaryKey(); $pks = static::primaryKey();
foreach ($keys as $key) { if (count($keys) === count($pks)) {
if (!in_array($key, $pks, true)) { return count(array_intersect($keys, $pks)) === count($pks);
return false; } else {
} return false;
} }
return count($keys) === count($pks);
} }
} }
...@@ -55,7 +55,7 @@ class UniqueValidator extends Validator ...@@ -55,7 +55,7 @@ class UniqueValidator extends Validator
return; return;
} }
/** @var \yii\db\ActiveRecordInterface $className */ /** @var ActiveRecordInterface $className */
$className = $this->className === null ? get_class($object) : $this->className; $className = $this->className === null ? get_class($object) : $this->className;
$attributeName = $this->attributeName === null ? $attribute : $this->attributeName; $attributeName = $this->attributeName === null ? $attribute : $this->attributeName;
...@@ -67,6 +67,7 @@ class UniqueValidator extends Validator ...@@ -67,6 +67,7 @@ class UniqueValidator extends Validator
$exists = $query->exists(); $exists = $query->exists();
} else { } else {
// if current $object is in the database already we can't use exists() // if current $object is in the database already we can't use exists()
/** @var ActiveRecordInterface[] $objects */
$objects = $query->limit(2)->all(); $objects = $query->limit(2)->all();
$n = count($objects); $n = count($objects);
if ($n === 1) { if ($n === 1) {
...@@ -75,7 +76,7 @@ class UniqueValidator extends Validator ...@@ -75,7 +76,7 @@ class UniqueValidator extends Validator
$exists = $object->getOldPrimaryKey() != $object->getPrimaryKey(); $exists = $object->getOldPrimaryKey() != $object->getPrimaryKey();
} else { } else {
// non-primary key, need to exclude the current record based on PK // non-primary key, need to exclude the current record based on PK
$exists = array_shift($objects)->getPrimaryKey() != $object->getOldPrimaryKey(); $exists = $objects[0]->getPrimaryKey() != $object->getOldPrimaryKey();
} }
} else { } else {
$exists = $n > 1; $exists = $n > 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment