当 flush() 主键没有被插入时
when flush() primary key does not get inserted
我正在做一个 PHP 项目,利用 Symfony 2 和 Doctrine 作为 ORM。当我坚持并刷新对象时,主键列甚至不在 insert SQL DML 语句中,当然会引发错误。 ID 是生成的值,使用 PHP 的 uniqid。
我将提供控制器的实体和代码片段。
/**
* Metrics
*
* @ORM\Table(name="metrics", indexes={@ORM\Index(name="metrics_assignedTo_fk", columns={"assignedTo"}), @ORM\Index(name="metrics_ui_fk", columns={"ui"})})
* @ORM\Entity
*/
class Metrics
{
/**
* @var string
*
* @ORM\Column(name="baseline", type="string", length=15, nullable=true)
*/
private $baseline;
/**
* @var string
*
* @ORM\Column(name="testEvent", type="string", length=40, nullable=true)
*/
private $testevent;
/**
* @var string
*
* @ORM\Column(name="status", type="string", length=20, nullable=true)
*/
private $status;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date", nullable=true)
*/
private $date;
/**
* @var \DateTime
*
* @ORM\Column(name="shotStart", type="datetime", nullable=true)
*/
private $shotstart;
/**
* @var \DateTime
*
* @ORM\Column(name="shotEnd", type="datetime", nullable=true)
*/
private $shotend;
/**
* @var string
*
* @ORM\Column(name="c2p", type="string", length=10, nullable=true)
*/
private $c2p;
/**
* @var string
*
* @ORM\Column(name="notes", type="string", length=200, nullable=true)
*/
private $notes;
/**
* @var string
*
* @ORM\Column(name="uniqueid", type="string", length=100, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $uniqueid;
/**
* @var \fti\webBundle\Entity\Employees
*
* @ORM\ManyToOne(targetEntity="fti\webBundle\Entity\Employees")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="ui", referencedColumnName="empid")
* })
*/
private $ui;
}
为了清楚起见,我省略了 getter 和 setter。
$shotObj->setShotstart(date_create($postData['start']));
$shotObj->setShotend(date_create($postData['end']));
$shotObj->setC2p($postData['c2p']);
$shotObj->setUniqueid((uniqid('', true)));
$shotForm = $this->createFormBuilder($shotObj)
->add('status', 'choice', array(
'choices' => array(
'changed' => 'Changed',
'canceled' => 'Canceled',
'added' => 'Added'
),
'multiple' => false,
'expanded' => false,
'required' => false,
'placeholder' => '-'
))
->add('c2p', 'hidden')
->add('shotStart', 'datetime', array(
'attr' => array(
'style' => 'display: none'
)
))
->add('shotEnd', 'datetime', array(
'attr' => array(
'style' => 'display: none'
)
))
->add('uniqueid', 'hidden')
->add('baseline', 'choice', array(
'choices' => $this->buildBLChoices(),
'multiple' => false,
'expanded' => false,
'placeholder' => '-'
))
->add('testevent', 'choice', array(
'choices' => $this->buildTEChoices(),
'multiple' => false,
'expanded' => false,
'required' => false,
'placeholder' => '-'
))
->add('test', 'text', array(
'mapped' => false,
'required' => false
))
->add('assignedTo', 'entity', array(
'class' => 'ftiwebBundle:Employees',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('e')
->where('e.active = 1')
->orderBy('e.lastname', 'ASC');
}
,
'multiple' => false,
'expanded' => false,
'placeholder' => '-',
))
->add('ui', 'entity', array(
'class' => 'ftiwebBundle:Employees',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('e')
->where('e.active = 1')
->orderBy('e.lastname', 'ASC');
}
,
'multiple' => false,
'expanded' => false,
'placeholder' => '-',
))
->add('notes', 'textarea')
->add('submit', 'submit')
->add('SubmitAndAlert', 'submit')
->getForm();
$shotForm->handleRequest($request);
if($shotForm->isValid()) {
$formData = $request->request->get('form');
if ($formData['test']) {
$shotObj->setTestevent($formData['test']);
}
$em->persist($shotObj);
$em->flush();
}
returns的错误是:
使用参数 ["foo", "foo", null, "2015-03-03 00:30:00", "2015-03-03 02:30:00 执行 'INSERT INTO metrics (baseline, testEvent, status, shotStart, shotEnd, c2p, notes, date, ui, assignedTo) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' 时发生异常]", "foo", "test", 空, 18, 21]:
如你所见,主键(uniqueId)不在要插入的列中,这让我相信它的映射
任何帮助将不胜感激
你应该玩 @ORM\GeneratedValue(strategy="NONE")
,你可以选择:
AUTO, SEQUENCE, TABLE, IDENTITY, UUID, CUSTOM and NONE.
我用
AUTO
- 告诉 Doctrine 选择所用数据库平台首选的策略。 MySQL
、SQLite
和 MsSQL
的首选策略是 IDENTITY
,Oracle
和 PostgreSQL
的首选策略是 SEQUENCE
。此策略提供了完整的可移植性。
如果您正在使用 PHP uniqueid 生成,请使用下一个注释:
/**
* @ORM\Column(type="guid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
*/
感谢大家的帮助。答案最终是,在 orm.xml 文件中,生成值永远不会改变,我在 xml 文档中手动删除了生成值。在此之后,插入 DML 语句正常工作,我在我的数据库中看到了该行。 orm.xml 文件位于 Bundle/Resources/config/doctrine 目录中。
我正在做一个 PHP 项目,利用 Symfony 2 和 Doctrine 作为 ORM。当我坚持并刷新对象时,主键列甚至不在 insert SQL DML 语句中,当然会引发错误。 ID 是生成的值,使用 PHP 的 uniqid。 我将提供控制器的实体和代码片段。
/**
* Metrics
*
* @ORM\Table(name="metrics", indexes={@ORM\Index(name="metrics_assignedTo_fk", columns={"assignedTo"}), @ORM\Index(name="metrics_ui_fk", columns={"ui"})})
* @ORM\Entity
*/
class Metrics
{
/**
* @var string
*
* @ORM\Column(name="baseline", type="string", length=15, nullable=true)
*/
private $baseline;
/**
* @var string
*
* @ORM\Column(name="testEvent", type="string", length=40, nullable=true)
*/
private $testevent;
/**
* @var string
*
* @ORM\Column(name="status", type="string", length=20, nullable=true)
*/
private $status;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date", nullable=true)
*/
private $date;
/**
* @var \DateTime
*
* @ORM\Column(name="shotStart", type="datetime", nullable=true)
*/
private $shotstart;
/**
* @var \DateTime
*
* @ORM\Column(name="shotEnd", type="datetime", nullable=true)
*/
private $shotend;
/**
* @var string
*
* @ORM\Column(name="c2p", type="string", length=10, nullable=true)
*/
private $c2p;
/**
* @var string
*
* @ORM\Column(name="notes", type="string", length=200, nullable=true)
*/
private $notes;
/**
* @var string
*
* @ORM\Column(name="uniqueid", type="string", length=100, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $uniqueid;
/**
* @var \fti\webBundle\Entity\Employees
*
* @ORM\ManyToOne(targetEntity="fti\webBundle\Entity\Employees")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="ui", referencedColumnName="empid")
* })
*/
private $ui;
}
为了清楚起见,我省略了 getter 和 setter。
$shotObj->setShotstart(date_create($postData['start']));
$shotObj->setShotend(date_create($postData['end']));
$shotObj->setC2p($postData['c2p']);
$shotObj->setUniqueid((uniqid('', true)));
$shotForm = $this->createFormBuilder($shotObj)
->add('status', 'choice', array(
'choices' => array(
'changed' => 'Changed',
'canceled' => 'Canceled',
'added' => 'Added'
),
'multiple' => false,
'expanded' => false,
'required' => false,
'placeholder' => '-'
))
->add('c2p', 'hidden')
->add('shotStart', 'datetime', array(
'attr' => array(
'style' => 'display: none'
)
))
->add('shotEnd', 'datetime', array(
'attr' => array(
'style' => 'display: none'
)
))
->add('uniqueid', 'hidden')
->add('baseline', 'choice', array(
'choices' => $this->buildBLChoices(),
'multiple' => false,
'expanded' => false,
'placeholder' => '-'
))
->add('testevent', 'choice', array(
'choices' => $this->buildTEChoices(),
'multiple' => false,
'expanded' => false,
'required' => false,
'placeholder' => '-'
))
->add('test', 'text', array(
'mapped' => false,
'required' => false
))
->add('assignedTo', 'entity', array(
'class' => 'ftiwebBundle:Employees',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('e')
->where('e.active = 1')
->orderBy('e.lastname', 'ASC');
}
,
'multiple' => false,
'expanded' => false,
'placeholder' => '-',
))
->add('ui', 'entity', array(
'class' => 'ftiwebBundle:Employees',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('e')
->where('e.active = 1')
->orderBy('e.lastname', 'ASC');
}
,
'multiple' => false,
'expanded' => false,
'placeholder' => '-',
))
->add('notes', 'textarea')
->add('submit', 'submit')
->add('SubmitAndAlert', 'submit')
->getForm();
$shotForm->handleRequest($request);
if($shotForm->isValid()) {
$formData = $request->request->get('form');
if ($formData['test']) {
$shotObj->setTestevent($formData['test']);
}
$em->persist($shotObj);
$em->flush();
}
returns的错误是: 使用参数 ["foo", "foo", null, "2015-03-03 00:30:00", "2015-03-03 02:30:00 执行 'INSERT INTO metrics (baseline, testEvent, status, shotStart, shotEnd, c2p, notes, date, ui, assignedTo) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' 时发生异常]", "foo", "test", 空, 18, 21]:
如你所见,主键(uniqueId)不在要插入的列中,这让我相信它的映射 任何帮助将不胜感激
你应该玩 @ORM\GeneratedValue(strategy="NONE")
,你可以选择:
AUTO, SEQUENCE, TABLE, IDENTITY, UUID, CUSTOM and NONE.
我用
AUTO
- 告诉 Doctrine 选择所用数据库平台首选的策略。 MySQL
、SQLite
和 MsSQL
的首选策略是 IDENTITY
,Oracle
和 PostgreSQL
的首选策略是 SEQUENCE
。此策略提供了完整的可移植性。
如果您正在使用 PHP uniqueid 生成,请使用下一个注释:
/**
* @ORM\Column(type="guid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
*/
感谢大家的帮助。答案最终是,在 orm.xml 文件中,生成值永远不会改变,我在 xml 文档中手动删除了生成值。在此之后,插入 DML 语句正常工作,我在我的数据库中看到了该行。 orm.xml 文件位于 Bundle/Resources/config/doctrine 目录中。