考虑具有外键的实体。我们收到一个包含外键作为整数的数组,我们想要从数组中填充当前实体(这可能是更新或创建,没有区别)。到目前为止,我无法在文档中找到如何以“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;
}
}
答案 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;
}