0

我对 Doctrine\ORM\Mapping 问题感到困惑。我有两个实体,它们是多对一的单向关系。我想在不影响生产者的情况下操作 Chipinfo(add/update/delete)。仅持久化 Chipinfo 而没有持久化生产者..

class Chipinfo  implements
{
/**
 * @var integer
 *
 * @ORM\Column(name="ChipID", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $chipid;

/**
 * @var \Shop\Entity\Producer
 *
 * @ORM\ManyToOne(targetEntity="Shop\Entity\Producer")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="pId", referencedColumnName="producerid")
 * })
 */
protected $pid;
}  
class Producer{

/**
* @ORM\Id
* @ORM\Column(name="producerid", type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $producerId;

/**
* @ORM\Column(name="producername", type="string")
*/
protected $producerName;
}

ChipInfo和Producer是多对一的单向关系:一个chipinfo只能由一个producer构建,一个producer可以构建多个chipinfo。我想要的是:在 Chipinfo 中添加/更新/删除项目不会对 Producer 产生任何影响。

$chip = new Chipinfo();
$formData = $this->initFormData($form->getData());
$chip->populate($formData);
$this->getEntityManager()->persist($chip);
$this->getEntityManager()->flush();

private function initFormData(&$raw){

    $raw['eid'] = new Encapuser($this->findEntity("Shop\Entity\Encapuser", $raw['eid']));
    $this->log($raw->eid);
    $raw['vid'] = new Vendors($this->findEntity("Shop\Entity\Vendors", $raw['vid']));

    $raw['pid'] = new Producer($this->findEntity("Shop\Entity\Producer", $raw['pid']));

    $this->log($raw);
    return $raw;

}

会抛出错误:

    通过关系“Shop\Entity\Chipinfo#pid”找到了一个新实体,该关系未配置为对实体进行级联持久操作:Shop\Entity\Producer@00000000349002ee00000000c955fd11。要解决这个问题:要么在这个未知实体上显式调用 EntityManager#persist(),要么配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“Shop\Entity\Producer#__toString()”以获得线索。

然后我将pid配置为:

@ORM\ManyToOne(targetEntity="Shop\Entity\Producer", cascade={"persist"})

虽然错误消失了,但这不是我想要的。因为当我用现有的生产者 A 为芯片信息调用 flush() 时,会插入一个重复的新 A。

因此,我的问题是: 1)我应该如何配置 @manyToone 字段,我没有从http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-associations.html#传递持久性级联操作

2) 我应该添加:@ORM\OneToMany, targetEntity="Shop\Entity\Producer" private @chip;

在制片人?如果是这样,生产者上的操作(添加/删除/更新)是否需要构造一个@chip?

4

1 回答 1

1

您必须在实体的 $pid 字段中设置现有的生产者(通过学说检索的实体)。

为什么要创建一个新的 Producer ?findEntity 是做什么的?它似乎没有从 Doctrine 中检索到实际实体,这是为什么呢?

通常你会做的是:

$chip->setPid($this->getEntityManager()->getRepository('Shop\Entity\Producer')->find($pid));
于 2013-08-30T13:59:11.900 回答