提问人:Arno van Oordt 提问时间:8/18/2023 最后编辑:Arno van Oordt 更新时间:8/19/2023 访问量:33
PHP / Mongo:持久化模型不会反序列化
PHP / Mongo: Persistable models don't unserialize
问:
我正在尝试使用持久化模型作为 Mongo 文档中的值 Persistable 类如下所示:
<?php
namespace Domain\Media\Models;
use MongoDB\BSON\Persistable;
class MediaUid implements Persistable
{
public readonly string $val;
public function __construct(string $val)
{
$this->val = $val;
}
public function __toString()
{
return $this->val;
}
public function bsonSerialize()
{
return ['val' => $this->val];
}
public function bsonUnserialize(array $data)
{
$this->val = $data['val'];
}
}
我有一个像这样的模型
<?php
namespace Domain\Collection\Models;
use Jenssegers\Mongodb\Eloquent\Model;
class SomeModel extends Model
{
protected $connection = 'mongodb';
}
我是这样保存模型的:
$test = new SomeModel();
$test->someId = new ObjectId();
$test->someMedia = new MediaUid('1234567890');
$test->save();
序列化非常完美,文档如下所示:
$t = SomeModel::find($test->id);
print_r(json_decode($t->__toString())); // Prints:
// stdClass Object
// (
// [_id] => 64e08963b7b5fab0a10573c3
// [someId] => 64e08963b7b5fab0a10573c2
// [someMedia] => stdClass Object
// (
// [__pclass] => stdClass Object
// (
// [$binary] => RG9tYWluXEZpbGVcTW9kZWxzXE1lZGlhVXVpZA==
// [$type] => 80
// )
//
// [val] => 1234567890
// )
//
// [updated_at] => 2023-08-19T09:20:35.073000Z
// [created_at] => 2023-08-19T09:20:35.073000Z
// )
当我读取单个值时,它现在是一个 MongoDB\BSON\ObjectIdArray(它应该是),但它仍然是一个普通数组而不是 MediaUidsomeId
someMedia
print_r(get_class($t->someId) . PHP_EOL); // Prints: MongoDB\BSON\ObjectIdArray
print_r(gettype($t->someMedia) . PHP_EOL); // Prints: array
关于持久性类应该如何工作的示例很少,所以我想知道我是否做错了什么或只是错过了什么?
我正在使用 Laravel,所以也许它的方式与它检索文档的方式有关?
如果不应该像这样工作,那么我想知道正确的方法应该是什么。bsonUnserialize
PS:在我的实际代码中,这些 id 到处使用(有时是深度嵌套的),因此手动将它们转换为 MediaUid 远非理想。
使用的版本:
- PHP v8.2 版本
- 拉拉维尔 v10.0
- 单声道:6.0
- Jenssegers/MongoDB
dev-master
答: 暂无答案
评论
someMedia