Doctrine Symfony2将关联实体与现有关联实体

时间:2017-05-20 10:02:14

标签: symfony doctrine

我有两个实体产品和类别与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方法来获取它的类别实例时,但我不喜欢这个解决方案,我想让应用程序更快,是否有任何解决方案。 感谢

4 个答案:

答案 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();