我有两个实体产品和类别与ManyToOne类型的关联,假设我想创建一个新产品,我已经知道它的类别(意味着我知道ID类别)
CLASS PRODUCT
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;
}
CLASS CATEGORY
/**
* @ORM\Entity
* @ORM\Table(name="category")
*/
class Category
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
SCRNARIO:创建新产品并假设我知道ID类别,因此我们不需要使用Category Entity的find方法来获取它(使事情更快)
$em = $this->get('doctrine')->getManager();
$category = new Category();
$category->setId(12);
$product = new Product();
$product->setName('product 1');
$product->setCategory($category);
$em->persist($product);
$em->flush();
上面的代码无法生成异常:
通过这种关系找到了一个新的实体 ' AOBundle \实体\产品类别#'没有配置为级联 坚持实体运营: AOBundle \实体\目录@ 0000000049a05dc500000000723a1be6。要解决 此问题:在此显式调用EntityManager#persist() 未知实体或配置级联持久化此关联 映射例如@ManyToOne(..,cascade = {" persist"})。如果你不能 找出导致问题实施的实体 ' AOBundle \实体\类别#__的toString()'得到一个线索。
但是当我使用find方法来获取它的类别实例时,但我不喜欢这个解决方案,我想让应用程序更快,是否有任何解决方案。 感谢
答案 0 :(得分:1)
您可以使用EntityManager的getReference方法。
您的代码应如下所示。
$em = $this->get('doctrine')->getEntityManager();
$category = $em->getReference('AppBundle:Category', 12);
$product = new Product();
$product->setName('product 1');
$product->setCategory($category);
$em->persist($product);
$em->flush();
答案 1 :(得分:0)
错误意味着如果你坚持产品,你需要使用级联,因为你还没有创建类别。
所以你可以这样做:
$em = $this->get('doctrine')->getManager();
$category = new Category();
$category->setId(12);
$em->persist($category);
$product = new Product();
$product->setName('product 1');
$product->setCategory($category);
$em->persist($product);
$em->flush();
我不知道您为什么设置类别ID,但我建议您删除它
答案 2 :(得分:0)
也许你没有选择现有的类别。
class Map:
keys = []
values = []
def __init__(self,leng):
for i in range(leng):
self.keys.append(str(i))
self.values.append(0)
@classmethod
def insert(self, key, value):
self.keys.append(key)
self.values.append(value)
@classmethod
def lookup(self, key):
for x in range(0, len(self.keys)):
if self.keys[x] == key:
return self.values[x]
return None
答案 3 :(得分:0)
我遇到了同样的问题,我的解决方案是避免将类别存储到变量中,但始终调用find函数。我没有找到解释,但是它帮助我前进了。在您的示例中:
$em = $this->get('doctrine')->getManager();
$category = new Category();
$category->setId(12);
$em->persist($category);
$product = new Product();
$product->setName('product 1');
$product->setCategory($em->getRepository(Category::class)->find(12));
$em->persist($product);
$product = new Product();
$product->setName('product 2');
$product->setCategory($em->getRepository(Category::class)->find(12));
$em->persist($product);
$em->flush();