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

时间:2013-06-14 22:06:58

标签: php symfony doctrine-orm

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

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

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

有人能指出我的理智方向吗?

示例代码:

<?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;
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

当你使用教条时,你不应该使用外键( 但是有了类别对象。所以实际上你应该将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;
}