Doctrine 2 @Id @GeneratedValue问题

时间:2014-06-24 16:05:00

标签: php doctrine-orm

所以即使我已经解决了我自己的问题,我想知道的是,如果我以正确的方式做到了吗?

我正在使用Doctrine文档中的代码将新记录插入到数据库中,我的代码看起来像这样,并且它正在循环,因为xlsx正在由PHPExcel进行处理。

我为实体设置了这个

/**
 * @var integer $id
 *
 * @Column(name="uploaduserid", type="integer", nullable=false)
 * @Id
 * @GeneratedValue(strategy="IDENTITY")
 */
private $id;

-

 $user = new \Uploaduserdetails();
 $user->id = 0;
 $user->userid = $item->userid;
 $user->email = $cells['A'];
 $user->firstname = $cells['B'];
 $user->lastname = $cells['C'];
 $user->street = $cells['D'];
 $user->city = $cells['E'];
 $user->state = $cells['F'];
 $user->zip = $cells['G'];
 $user->mobile = $cells['H'];

 $entityManager->persist($user);
 $entityManager->flush();

现在,即使这有效并且记录出现在数据库(MariaDB)中,但是我知道这一点似乎有点过分了但是这个

$user->id = 0;

根据文档http://docs.doctrine-project.org/en/latest/tutorials/getting-started.html(如下所示),不需要设置。设置名称,持久保存对象并刷新。但在我的情况下,如果我没有将id的值设置为数字,我会得到下面的致命错误。 DB中的结果是预期的唯一编号,而不是值集,这很好。我也尝试将生成策略设置为“AUTO”,将其保留,只留下@GeneratedValue。所有都会产生相同的错误。

  

致命错误:带有消息的未捕获异常'Doctrine \ ORM \ ORMException''类型为Uploaduserdetails的实体缺少字段'id'的已分配ID。此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。

<?php
// src/Product.php
/**
 * @Entity @Table(name="products")
 **/
class Product
{
    /** @Id @Column(type="integer") @GeneratedValue **/
    protected $id;
    /** @Column(type="string") **/
    protected $name;

    // .. (other code)
}

-

<?php
// create_product.php
require_once "bootstrap.php";

$newProductName = $argv[1];

$product = new Product();
$product->setName($newProductName);

$entityManager->persist($product);
$entityManager->flush();

echo "Created Product with ID " . $product->getId() . "\n";

1 个答案:

答案 0 :(得分:1)

找到了我自己的问题的答案。

您应该只在自动生成数字或序列的主键上使用@GeneratedValue(strategy =&#34; IDENTITY&#34;)。