Php 条令中同一列的两个不同类型的属性
我试图将两个属性绑定到教义中的同一列 我的目标是能够从整数值Php 条令中同一列的两个不同类型的属性,php,doctrine-orm,Php,Doctrine Orm,我试图将两个属性绑定到教义中的同一列 我的目标是能够从整数值$entity->setSomeId(3)中填充和查找整数列,但也能够使用引用的对象$entity->setSome($some)(其中$some是一个对象) 我已尝试将我的实体定义为: /** * @var Some * * @ORM\OneToOne(targetEntity="Some") * @ORM\joinColumn(name="id", referencedColumnName="other_id") */ p
$entity->setSomeId(3)
中填充和查找整数列,但也能够使用引用的对象$entity->setSome($some)
(其中$some是一个对象)
我已尝试将我的实体定义为:
/**
* @var Some
*
* @ORM\OneToOne(targetEntity="Some")
* @ORM\joinColumn(name="id", referencedColumnName="other_id")
*/
private $someId;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", length=11, precision=0, scale=0, nullable=false, unique=true)
*/
private $something;
它用于检索数据,但在我尝试创建实体时不起作用
我通过以下方式创建实体:
$entity = new Entity();
$entity->setSomeId(3)
$entity->getSomeId(); // = 3
$em->persist($entity);
$em->flush();
给我以下错误:
`Integrity constraint: Column id cannot be null`
我猜这是因为$something
在某个地方覆盖了$someId
的值
有可能用教义做我想做的事吗?或者我应该只使用引用的对象,而忘记将整数直接分配给该列吗?您可能需要一对一的双向关系: 下面的代码片段来自位于以下位置的条令文档:
而不是通过指定“整数到$someId,描述您要创建的实体之间的整体OneToOne关系。我可以在这方面更好地帮助你们,因为我认为你们在试图规避教义,而它已经很好地处理了人际关系。此外,认识到条令将在几乎每个实体中处理您的密钥也是很重要的。我还没有发现有必要绕过这一点。你应该使用“引用”实体。请参阅答案。我将尝试一下。我看到你没有提到*@var Cart$Cart
,而我提到了,这可能是Doctrine拒绝让我将Id设置为整数并强迫我给出一个对象的原因吗?Doctrine希望你使用相关实体,而不是设置“Id”。让条令为您处理键,因为它管理对象关系映射(因此您不必这样做)。例如,在一些多对多关系中,条令实际上会创建一个“连接”表,其中包含两个相关表的键。这只是条令如何帮助你更聪明地工作的一个例子。您刚刚熟悉了条令,它是更抽象的软件层。更新对象原则“给你”,然后persist()
和flush()
。“身份证”是为你处理的。找出我的问题所在。如果事实是正确的,我的原则中的关系原则是正确的,但我的问题是我在做一个->find
来检索引用的实体,而不是->getReference
,从查询的数量来看,这听起来很糟糕。我将继续使用实体关系和引用,这很好。谢谢
<?php
/** @Entity */
class Customer
{
// ...
/**
* One Customer has One Cart.
* @OneToOne(targetEntity="Cart", mappedBy="customer")
*/
private $cart;
public function getCart() {
return $this->cart;
}
// ...
}
/** @Entity */
class Cart
{
// ...
/**
* One Cart has One Customer.
* @OneToOne(targetEntity="Customer", inversedBy="cart")
* @JoinColumn(name="customer_id", referencedColumnName="id")
*/
private $customer;
public function getCustomer() {
return $this->customer;
}
// ...
}