Symfony 5 在 MongoDB 集合中保存对象
Symfony 5 Save Object in MongoDB Collection
我从未使用过 MongoDb,我也是 symfony 和 ODM 的新手。我有一个名为用户列表的集合。在用户列表中,我想保存多本书。在我发送到服务器的表单上选择了图书 ID,在我的控制器中我想使用所有选定的 BookId 使用 find($id) 并将返回的图书详细信息保存在我的用户列表中。
Document\Userlist.php
class Userlist{
/**
* @MongoDB\Id
*/
private $id;
/**
* @MongoDB\Field(type="string")
*/
private $name;
/**
* @MongoDB\Field(type="collection")
*/
private $books;
}
public function __construct()
{
$this->books = new ArrayCollection();
}
public function getBooks(): ?array
{
return array_unique($this->books);
}
public function setBooks(array $books): self
{
$this->books= $books;
return $this;
}
MyController.php
foreach ($_POST['books'] as $bookObjectId) {
$bookData= $dm->getRepository(Book::class)->find($bookObjectId);
$userlist->setBooks($bookData);
$dm->persist($userlist);
$dm->flush();
}
如果我使用上面的方法,我得到 Collection type requires value of type array or null, Doctrine\Common\Collections\ArrayCollection 给定。所以如果我拿 $this->books = new ArrayCollection();这个错误消失了。不幸的是,我保存到文档中的只是
书籍
[0]
没有数据被保存。如果我使用
$bookData= $dm->getRepository(Book::class)->find($bookObjectId);
$books = array('_id' => $bookData->getId(),
'name' =>$bookData->getBookName());
$userlist->setBooks($bookData);
$dm->persist($userlist);
$dm->flush();
然后数据将全部保存,但我只想获取我的 1 个文档并将其直接保存到另一个文档中,而不需要通过调用所有 getter 重新创建一个数组然后保存它。我试图在互联网上阅读所有内容,但我就是不明白。我也试过了
public function addBooks(Book $books)
{
$this->books[] = $books;
return $this;
}
但还是没有运气。顺便说一句,表单没有 BookId 表单字段。相反,我使用 jQuery 创建此动态,但我怀疑这是一个问题。任何人都可以指出正确的方向,这将是非常棒的。非常感谢。
更新
我的存储库文件:
public function findReturnArray($id)
{
return $this->createQueryBuilder()
->hydrate(false)
->field('_id')->equals($id)
->getQuery()
->execute()->toArray();
}
在控制器中:
foreach ($_POST['bookIds'] as $orderObjectId) {
$bookData[] = $dm->getRepository(Book::class)->findReturnArray($bookObjectId);
}
$userlist->setBooks($bookData);
$dm->persist($userlist);
这确实将两本书都保存到了书本中,但我有 1 期。是这样保存的
books
[] [0]
{}[0]
bookId
bookName etc
[] [1]
{}[0]
bookId
bookName
我想要的是:
books
{}[0]
bookId
bookName etc
{}[1]
bookId
bookName
setBooks 还是一样,但我使用了 $this->books = new ArrayCollection();出去。知道我现在该如何停止吗?
如果您想在 Userlist
文档中保留对 Book
文档的引用,则必须使用 ReferenceMany
注释(参见 docs)。
class Userlist
{
// ...
/**
* @MongoDB\ReferenceMany(targetDocument="My\Namespace\Book", storeAs="id")
*/
private $books;
public function __construct()
{
$this->books = new ArrayCollection();
}
public function getBooks(): array
{
return $this->books->getValues();
}
public function addBook(Book $book)
{
if ($this->books->contains($book)) {
return;
}
$this->books->add($book);
}
}
foreach ($_POST['books'] as $bookObjectId) {
$book = $dm->getRepository(Book::class)->find($bookObjectId);
$userlist->addBook($book);
}
$dm->persist($userlist);
$dm->flush();
更新
阅读您的更新后,我想这就是您正在寻找的更改:
public function findReturnArray($id)
{
return $this->createQueryBuilder()
->hydrate(false)
->field('_id')->equals($id)
->getQuery()
->getSingleResult();
}
我从未使用过 MongoDb,我也是 symfony 和 ODM 的新手。我有一个名为用户列表的集合。在用户列表中,我想保存多本书。在我发送到服务器的表单上选择了图书 ID,在我的控制器中我想使用所有选定的 BookId 使用 find($id) 并将返回的图书详细信息保存在我的用户列表中。
Document\Userlist.php
class Userlist{
/**
* @MongoDB\Id
*/
private $id;
/**
* @MongoDB\Field(type="string")
*/
private $name;
/**
* @MongoDB\Field(type="collection")
*/
private $books;
}
public function __construct()
{
$this->books = new ArrayCollection();
}
public function getBooks(): ?array
{
return array_unique($this->books);
}
public function setBooks(array $books): self
{
$this->books= $books;
return $this;
}
MyController.php
foreach ($_POST['books'] as $bookObjectId) {
$bookData= $dm->getRepository(Book::class)->find($bookObjectId);
$userlist->setBooks($bookData);
$dm->persist($userlist);
$dm->flush();
}
如果我使用上面的方法,我得到 Collection type requires value of type array or null, Doctrine\Common\Collections\ArrayCollection 给定。所以如果我拿 $this->books = new ArrayCollection();这个错误消失了。不幸的是,我保存到文档中的只是
书籍 [0]
没有数据被保存。如果我使用
$bookData= $dm->getRepository(Book::class)->find($bookObjectId);
$books = array('_id' => $bookData->getId(),
'name' =>$bookData->getBookName());
$userlist->setBooks($bookData);
$dm->persist($userlist);
$dm->flush();
然后数据将全部保存,但我只想获取我的 1 个文档并将其直接保存到另一个文档中,而不需要通过调用所有 getter 重新创建一个数组然后保存它。我试图在互联网上阅读所有内容,但我就是不明白。我也试过了
public function addBooks(Book $books)
{
$this->books[] = $books;
return $this;
}
但还是没有运气。顺便说一句,表单没有 BookId 表单字段。相反,我使用 jQuery 创建此动态,但我怀疑这是一个问题。任何人都可以指出正确的方向,这将是非常棒的。非常感谢。
更新
我的存储库文件:
public function findReturnArray($id)
{
return $this->createQueryBuilder()
->hydrate(false)
->field('_id')->equals($id)
->getQuery()
->execute()->toArray();
}
在控制器中:
foreach ($_POST['bookIds'] as $orderObjectId) {
$bookData[] = $dm->getRepository(Book::class)->findReturnArray($bookObjectId);
}
$userlist->setBooks($bookData);
$dm->persist($userlist);
这确实将两本书都保存到了书本中,但我有 1 期。是这样保存的
books
[] [0]
{}[0]
bookId
bookName etc
[] [1]
{}[0]
bookId
bookName
我想要的是:
books
{}[0]
bookId
bookName etc
{}[1]
bookId
bookName
setBooks 还是一样,但我使用了 $this->books = new ArrayCollection();出去。知道我现在该如何停止吗?
如果您想在 Userlist
文档中保留对 Book
文档的引用,则必须使用 ReferenceMany
注释(参见 docs)。
class Userlist
{
// ...
/**
* @MongoDB\ReferenceMany(targetDocument="My\Namespace\Book", storeAs="id")
*/
private $books;
public function __construct()
{
$this->books = new ArrayCollection();
}
public function getBooks(): array
{
return $this->books->getValues();
}
public function addBook(Book $book)
{
if ($this->books->contains($book)) {
return;
}
$this->books->add($book);
}
}
foreach ($_POST['books'] as $bookObjectId) {
$book = $dm->getRepository(Book::class)->find($bookObjectId);
$userlist->addBook($book);
}
$dm->persist($userlist);
$dm->flush();
更新
阅读您的更新后,我想这就是您正在寻找的更改:
public function findReturnArray($id)
{
return $this->createQueryBuilder()
->hydrate(false)
->field('_id')->equals($id)
->getQuery()
->getSingleResult();
}