У меня есть сущность с первичным ключом, как это:
/**
* @var integer
*
* @ORM\Column(name="product_id", type="integer", nullable=false)
* @ORM\Id
*/
protected $productId;
....
/**
* Set productId
*
* @param integer $productId
* @return Products
*/
public function setProductId($productId)
{
$this->productId = $productId;
return $this;
}
/**
* Get productId
*
* @return integer
*/
public function getProductId()
{
return $this->productId;
}
Но когда я пытаюсь вставить ProductId с помощью метода set, я получаю эту ошибку:
нарушение ограничения целостности 1062 повторяющаяся запись ‘0’ для ключа ‘primary’
Я пытался с * @ORM \ GeneratedValue (стратегии = «НЕТ»), но результат тот же, мне нужно установить идентификатор продукта, потому что последовательность не 1, 2, 3 … отличается.
И я не могу создать новый Id, потому что мой текущий ProductId используется другими объектами, такими как Foreing Keys.
Любое решение?
Заранее спасибо.
——Редактировать с файлом, где у меня есть ошибка ——
$prod = new Products();
$prod->setProductId("65");
$manager->persist($prod);
$manager->flush();
—-Редактировать со всей сущностью —-
пространство имен My \ WebBundle \ Entity;
используйте Doctrine \ ORM \ Mapping в качестве ORM;
class Products
{
/**
* @var integer
*
* @ORM\Column(name="product_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
protected $productId;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50, nullable=false)
*/
private $name;
/**
* @var integer
*
* @ORM\Column(name="version", type="integer", nullable=true)
*/
private $version;
/**
* @var string
*
* @ORM\Column(name="code", type="string", length=10, nullable=false)
*/
private $code;
/**
* @var integer
*
* @ORM\Column(name="price", type="integer", nullable=false)
*/
private $price;
/**
* Set productId
*
* @param integer $productId
* @return Products
*/
public function setProductId($productId)
{
$this->productId = $productId;
return $this;
}
/**
* Get productId
*
* @return integer
*/
public function getProductId()
{
return $this->productId;
}
/**
* Set name
*
* @param string $name
* @return Products
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set version
*
* @param integer $version
* @return Products
*/
public function setVersion($version)
{
$this->version = $version;
return $this;
}
/**
* Get version
*
* @return integer
*/
public function getVersion()
{
return $this->version;
}
/**
* Set code
*
* @param string $code
* @return Products
*/
public function setCode($code)
{
$this->code = $code;
return $this;
}
/**
* Get code
*
* @return string
*/
public function getCode()
{
return $this->code;
}
/**
* Set price
*
* @param integer $price
* @return Products
*/
public function setPrice($price)
{
$this->price = $price;
return $this;
}
/**
* Get price
*
* @return integer
*/
public function getPrice()
{
return $this->price;
}
При использовании стратегии генерации идентификаторов не следует забывать, что вам нужно назначить пользовательский идентификатор до Вы вызываете метод EntityManager persist ().
Я думаю, что вы сохраняете новый объект до назначения пользовательского идентификатора, что означает, что ваше свойство $ productId установлено на ноль и будет приведено к 0 (нулю), если вы попытаетесь сбросить его. Это приведет к вашей ошибке.
Маркус отправит хороший ответ на вашу проблему. Вы можете решить эту проблему, добавив id в свою сущность и используя productId в качестве вторичного ключа.
Добавить идентификатор и установить его на Авто приращение, как
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
Затем вы можете использовать ваш productId с:
/**
* @var integer
*
* @ORM\Column(name="product_id", type="integer", nullable=false)
*/
protected $productId;
С этим решением вы будете использовать $ productId в качестве вторичного ключа. Не забудьте очистить данные в вашей таблице.
У вас также есть ошибка здесь:
$prod->setProductId(65);
Теперь вы пытаетесь установить данные, которые являются строкой — в вашей таблице есть целое число.