php - Doctrine MongoDB 如何将 PersistentArray 中的嵌入式文档作为其实际类而不是 Array
问题描述
我的文档是一个ItemsList
,有一个Items
嵌入的文档。
问题是 Doctrine Mongo 没有将嵌入文档映射为 Item 对象,而是映射为数组。这个对吗?我将如何Item
以 OOP 方式更新?
项目列表.php
<?php
namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document(collection="itemslists")
*/
class ItemsList implements \JsonSerializable {
/**
* @MongoDB\Id
*/
private $id;
/**
* @MongoDB\EmbedMany(targetDocument="Item")
*/
private $items;
/**
* @return mixed
*/
public function getId() {
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id): void {
$this->id = $id;
}
/**
* @return mixed
*/
public function getItems() {
return $this->items;
}
/**
* @param mixed $items
*/
public function setItems($items): void {
$this->items = $items;
}
public function jsonSerialize() {
return [
'id' => $this->getId(),
'items' => json_encode($this->getItems()),
];
}
}
项目.php
<?php
namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\EmbeddedDocument
*/
class Item implements \JsonSerializable {
/**
* @MongoDB\Id
*/
private $id;
/**
* @MongoDB\Field(type="string")
*/
private $imgPath;
/**
* @MongoDB\Field(type="string")
*/
private $description;
/**
* @return mixed
*/
public function getId() {
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id): void {
$this->id = $id;
}
/**
* @return mixed
*/
public function getImgPath() {
return $this->imgPath;
}
/**
* @param mixed $imgPath
*/
public function setImgPath($imgPath): void {
$this->imgPath = $imgPath;
}
/**
* @return mixed
*/
public function getDescription() {
return $this->description;
}
/**
* @param mixed $description
*/
public function setDescription($description): void {
$this->description = $description;
}
public function jsonSerialize() {
return [
'id' => $this->getId(),
'img_path' => $this->getImgPath(),
'description' => $this->getDescription(),
];
}
}
转储 $itemsList = $itemsListRepository->findBy([], null, 1);
ItemsListController.php on line 23:
array:1 [▼
0 => ItemsList {#579 ▼
-id: "5b63016b3faeb7e511d6d064"
-items: PersistentCollection {#584 ▼
-snapshot: []
-owner: ItemsList {#579}
-mapping: array:21 [▶]
-isDirty: false
-initialized: false
-coll: ArrayCollection {#583 ▶}
-dm: DocumentManager {#483 …13}
-uow: UnitOfWork {#486 ▶}
-mongoData: array:3 [▼
0 => array:3 [▼
"_id" => MongoId {#572 ▶}
"img_path" => "/tmp/1.jpg"
"description" => "Una descripcion"
]
1 => array:3 [▶]
2 => array:3 [▶]
]
-hints: []
}
}
]
解决方案
似乎它们在使用以下方法时被转换了PersistentCollection
public function getFirstList() {
/** @var Repository $itemsListRepository */
$itemsListRepository = $this->get('doctrine_mongodb')->getRepository('App:ItemsList');
/** @var ItemsList $itemsList */
$itemsLists = $itemsListRepository->findBy([], null, 1);
$itemsList = $itemsLists[0];
/** @var PersistentCollection $items */
$items = $itemsList->getItems();
dump($items->first(), json_encode($itemsList));
exit;
}
推荐阅读
- python - 将 python selenium 文件与其他文件导出到 .exe 文件中(已解决)
- python - 在机器学习中用列的平均值估算缺失值
- javascript - 如何在单击按钮转到另一个页面之前暂时重定向到一个页面
- pandas - 如何在 MultiIndex 组上应用函数
- c++ - 为什么需要使用 std::string_view 的 std::string 方法将其模板参数转换为正文中的 string_view
- activecollab - 如何通过 Active Collab API 设置或检索可用性条目?
- node.js - 在 Angular + Electron 应用程序中使用 better-sqlite3:模块解析失败:意外字符
- angular - Angular 中的 NgForm 是组件、结构还是属性的指令?
- uml - Graphviz dot 和 Doxygen 不生成 UML 图
- javascript - 带有 Chart.js 和来自 Google Sheet 的 JSON 数据的多轴折线图