所以即使我已经解决了我自己的问题,我想知道的是,如果我以正确的方式做到了吗?
我正在使用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";
答案 0 :(得分:1)
找到了我自己的问题的答案。
您应该只在自动生成数字或序列的主键上使用@GeneratedValue(strategy =&#34; IDENTITY&#34;)。