如何在Symfony2/doctrine中使用数组中的外键填充实体


How do you populate an Entity with foreign keys from an Array in Symfony2/doctrine

考虑一个具有外键的实体。我们接收到一个包含外键的整数数组,我们希望从数组中填充当前实体(这可以是更新或创建,没有区别)。到目前为止,我还无法在文档中找到如何以"symfony2/doctrine"方式执行此更新的示例。

如果我们将私有变量的类型更改为整数而不是Foreign实体类型的对象,我们将失去ORM映射/自动实例化等。如果保持原样,就不能用一个简单的整数来设置它。

原则文档规定我们不能从实体内部访问实体管理器(为了在设置当前实体值之前从键中"找到"外部实体),无论如何,如果我想这样做,我还没有找到如何做到这一点的文档。最佳实践规定,从数组中填充对象应该作为该对象的对象方法。根据常识,应该支持一个简单的数组,并且不应该要求最终用户/控制器知道如何创建外部实体。

谁能给我指指理智的方向?

示例代码:

<?php
namespace Prefix'MyBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
class Item
{
    private $itemid;
    /*
             * --- omitted for brevity ---
             */
    private $categoryid;
    public function getItemid()
    {
        return $this->itemid;
    }
    /**
     * --- omitted for brevity again ---
     */
    public function setCategoryid('Prefix'MyBundle'Entity'Category $categoryid = null)
    {
        $this->categoryid = $categoryid;
        return $this;
    }
    public function getCategoryid()
    {
        return $this->categoryid;
    }
    public function fromArray($data = array())
    {
        $updated = false;
        if ( isset($data['Category']) )
        {
            /* We know that $data['Category'] will be an int */
            $this->setCategoryid($data['Category']); //Fails invalid type!
            $updated = true;
        }
        return $updated;
    }
}

所以,你必须创建你的Category对象(拥有的一面,多面),然后从db中获取每个Item对象(你有一个整数数组,是id,所以你可以做一些像->findById()或自定义DQL查询,你可以把它们获取到一个镜头)。随后,您必须为每个获取的对象调用->setItems()->addItem(),并使用实体管理器的->persist(); ->flush();

当你使用doctrine时,你不应该使用外键(但是对于类别对象。因此,实际上您应该将id转换为函数之外的类别。

另一种选择是添加一个名为category的新列它的类型是整型你直接设置它这样你就知道有两个类变量指向同一个对象但其中一个有关系另一个只有id

/**
 * @ManyToOne...
 */
protected $category;
/**
 * @Column(type="integer")
 */
protected $categoryid;
public function setCategory('Prefix'MyBundle'Entity'Category $category = null)
{
    $this->category = $category;
    return $this;
 }
public function getCategory()
{
    return $this->category;
}
public function setCategoryId($categoryid = null)
{
    $this->categoryid = $categoryid;
    return $this;
 }
public function getCategoryId()
{
    return $this->categoryid;
}