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();
}