gpt4 book ai didi

symfony - Doctrine 刷新()错误: Expected value of type "Doctrine\Common\Collections\Collection|array"

转载 作者:行者123 更新时间:2023-12-02 18:22:10 27 4
gpt4 key购买 nike

我在 Symfony(使用 Doctrine)中使用多对多关系时遇到了一个奇怪的问题,我以前从未在具有多对多关系的 symfony 项目中遇到过这种情况,而且我找不到与其他项目有任何区别项目。

我有两个实体“产品”和“标签”,并且彼此之间存在多对多关系。不幸的是,如果我尝试将产品添加到标签,反之亦然,则会出现错误

Expected value of type "Doctrine\Common\Collections\Collection|array" for association field "TestBundle\Entity\Product#$tags", got "TestBundle\Entity\Tag" instead.

出现。用于向产品添加标签的代码:

    $tag1 = $em->getRepository('TestBundle:Tag')->findOneBy(array(
'tag' => "Bla"
));

$tag1->addProduct($product);
$em->persist($tag1);
$em->persist($product);

$em->flush();

当然,变量$tag1和$product都包含一个有效的实体。多对多关系的YAML文件(我删除了不相关的部分):

TestBundle\Entity\Tag:
type: entity
table: tags
repositoryClass: TestBundle\Repository\TagRepository
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
tag:
type: string
length: 255
unique: true
manyToMany:
products:
targetEntity: Product
mappedBy: tags
lifecycleCallbacks: { }

产品:

TestBundle\Entity\Product:
type: entity
table: products
repositoryClass: TestBundle\Repository\ProductRepository
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
name:
type: string
length: 255
unique: true
manyToOne:
manufacturer:
targetEntity: Manufacturer
inversedBy: products
joinColumn:
name: manufacturer_id
referencedColumnName: id
onDelete: CASCADE
manyToMany:
tags:
targetEntity: Product
inversedBy: products
joinTable:
name: tags2products
joinColumns:
tag_id:
referencedColumnName: id
inverseJoinColumns:
product_id:
referencedColumnName: id
lifecycleCallbacks: { }

setter 和 getter 函数也不包含任何特殊技巧:Tag.php实体文件包含:

 /**
* Constructor
*/
public function __construct()
{
$this->product = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
* Add product
*
* @param \TestBundle\Entity\Product $product
*
* @return Tag
*/
public function addProduct(\TestBundle\Entity\Product $product)
{
$product->addTag($this);
$this->product[] = $product;
return $this;
}


public function removeProduct(\TestBundle\Entity\Product $product)
{
$this->product->removeElement($product);
}

/**
* Get products
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getProducts()
{
return $this->products;
}

虽然 Product.php 包含:

 /**
* Add tag
*
* @param \TestBundle\Entity\Tag $tag
*
* @return Product
*/
public function addTag(Tag $tag)
{
$this->tags->add($tag);
//$this->tags[] = $tag;
return $this;
}

/**
* Remove tag
*
* @param \TestBundle\Entity\Tag $webpage
*/

public function removeTag(Tag $tag)
{
$this->tags->removeElement($tag) ;
}

/**
* Get webpages
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}

我还尝试添加 $this->tags = new ArrayCollection();到产品的构造函数,但它没有改变任何东西。

此外,向产品添加、读取和保留标签也没有问题。当我调用 $em->flush() 时,就会抛出错误。

有人知道为什么我的产品实体需要数组集合吗?我从来没有告诉过他要期待一个!预先非常感谢您!

最佳答案

该错误告诉您,您尝试刷新的实体 TestBundle\Entity\Product 的属性“#tags”包含 TestBundle\Entity\Tag 类型的对象,而不是该对象的集合。 Doctrine 需要这个集合/数组,因为该属性的元数据表明 TestBundle\Entity\Product 与 TestBundle\Entity\Tag 处于多个关系中,并且关系是通过属性“#tags”完成的。如果出现以下情况,就会发生这种情况:

//You did this
$this->tags = $tag;

//instead of what you actually did which is correct
$this->tags->add($tag);

//Or

$this->tags[] = $tag;

但是您在此处发布的代码不应产生该异常。

您确定没有其他地方可以调用访问器方法来更改 TestBundle\Entity\Product 的标签属性吗?像事件监听器之类的东西?

关于symfony - Doctrine 刷新()错误: Expected value of type "Doctrine\Common\Collections\Collection|array",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com