关系列中Doctrine for的默认值

时间:2016-05-25 09:48:42

标签: php symfony doctrine-orm doctrine

我知道有这个问题Default value in Doctrine

我的问题是,当列有ManyToOne关系时,如何在Doctrine2 / Symfony2中设置默认值= 0?

数据库中的product_id列是not null,我无法更改!

如果我执行setProductId(0),它会以某种方式被setProduct(null)覆盖而且我得到了。

Integrity constraint violation: 1048 Column 'product_id' cannot be null

如果我按照doctrine-faqs的建议默认$product = 0;$productId = 0;或两者,我

Expected value of type "Entity\Product" ...

我想设置它= 0如果没有设置!

是否可以或者甚至允许将$ productId和$ product属性指向同一个数据库列?

代码几乎看起来像这样:

class ShopLog {

/**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer", nullable=false) // , columnDefinition="DEFAULT 0" does not work
 */
private $productId;

/**
 * @var Entity\Product
 *
 * @ORM\ManyToOne(targetEntity="Entity\Product")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) // , columnDefinition="DEFAULT 0" does not work
 * })
 */
private $product;

/**
 * Set productId
 *
 * @param integer $productId
 * @return ShopLog
 */
public function setProductId($productId)
{

    $this->productId = $productId;

    return $this;
}

/**
 * Set product
 *
 * @param \Entity\Product $product
 * @return ShopLog
 */
public function setProduct(\Entity\Product $product = null)
{
    $this->product = $product;
    return $this;
}

1 个答案:

答案 0 :(得分:1)

你的问题有两个问题。

首先,您不能将$ product和$ productId属性指向同一数据库列。

您应该只有$ product属性,如果您需要访问产品的$ id属性,请执行以下操作:

$productId = $shoplog->getProduct()->getId(); 

其次,要允许数据库列product_id接受空值,只需在注释中设置它,就像Marius在其注释中所说的那样(之后,不要忘记用php app/console doctrine:schema:update更新数据库)。

因此,您的整个代码应如下所示:

class ShopLog {

/**
 * @var Entity\Product
 *
 * @ORM\ManyToOne(targetEntity="Entity\Product")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=true)
 * })
 */
private $product;

/**
 * Set product
 *
 * @param \Entity\Product $product
 * @return ShopLog
 */
public function setProduct(\Entity\Product $product = null)
{
    $this->product = $product;
    return $this;
}
}