diff --git a/src/Jenssegers/Mongodb/Eloquent/Model.php b/src/Jenssegers/Mongodb/Eloquent/Model.php index 894ebe41a..347cade4f 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Model.php +++ b/src/Jenssegers/Mongodb/Eloquent/Model.php @@ -9,6 +9,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Str; use Jenssegers\Mongodb\Query\Builder as QueryBuilder; +use MongoDB\BSON\Binary; use MongoDB\BSON\ObjectID; use MongoDB\BSON\UTCDateTime; use Illuminate\Contracts\Queue\QueueableEntity; @@ -56,6 +57,8 @@ public function getIdAttribute($value = null) // Convert ObjectID to string. if ($value instanceof ObjectID) { return (string) $value; + } elseif ($value instanceof Binary) { + return (string) $value->getData(); } return $value; @@ -165,7 +168,7 @@ protected function getAttributeFromArray($key) public function setAttribute($key, $value) { // Convert _id to ObjectID. - if ($key == '_id' && is_string($value)) { + if (($key == '_id' || Str::endsWith($key, '_id')) && is_string($value)) { $builder = $this->newBaseQueryBuilder(); $value = $builder->convertKey($value); @@ -197,6 +200,8 @@ public function attributesToArray() foreach ($attributes as $key => &$value) { if ($value instanceof ObjectID) { $value = (string) $value; + } elseif ($value instanceof Binary) { + $value = (string) $value->getData(); } } diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index a340976e3..9f27d77d8 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -11,6 +11,7 @@ use Illuminate\Support\Str; use Jenssegers\Mongodb\Connection; use MongoCollection; +use MongoDB\BSON\Binary; use MongoDB\BSON\ObjectID; use MongoDB\BSON\Regex; use MongoDB\BSON\UTCDateTime; @@ -849,6 +850,8 @@ public function convertKey($id) { if (is_string($id) && strlen($id) === 24 && ctype_xdigit($id)) { return new ObjectID($id); + } elseif (strlen($id) === 16 && preg_match('~[^\x20-\x7E\t\r\n]~', $id) > 0) { + return new Binary($id, Binary::TYPE_UUID); } return $id; @@ -909,7 +912,7 @@ protected function compileWheres() } // Convert id's. - if (isset($where['column']) && ($where['column'] == '_id' || Str::endsWith($where['column'], '._id'))) { + if (isset($where['column']) && ($where['column'] == '_id' || Str::endsWith($where['column'], '_id'))) { // Multiple values. if (isset($where['values'])) { foreach ($where['values'] as &$value) {