当flush()主键未插入时 [英] when flush() primary key does not get inserted
问题描述
我将提供实体和控制器的代码片段。
/ **
*指标
*
* @ ORM\Table(name =metrics,索引= {@ ORM\Index(name =metrics_assignedTo_fk,columns = {assignedTo}),@ ORM\索引(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,可空= true)
* /
private $ date;
/ **
* @var \DateTime
*
* @ ORM\Column(name =shotStart,type =datetime,可空= true)
* /
private $ shotstart;
/ **
* @var \DateTime
*
* @ ORM\Column(name =shotEnd,type =datetime,可空= 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 '=>数组(
'changed'=>'已更改',
'取消'=>'已取消',
'added'=>'添加'
),
'multiple'=> false,
'expanded'=> false,
'required'=> false,
'占位符'=> - '
))
- > add('c2p','hidden')
- > add('shotStart','datetime',array(
'attr '=>数组(
'style'=>'display:none'
)
))
- > add('shotEnd','datetim e',array(
'attr'=> array(
'style'=> '显示:none'
)
))
- > add('uniqueid','hidden')
- > add('baseline','choice' array(
'choices'=> $ this-> buildBLChoices(),
'multiple'=> false,
'expanded'=> false,
'占位符'=>' - '
))
- > add('testevent','choice',array(
'choices'=> $ this-> buildTEChoices )
'multiple'=> false,
'expanded'=> false,
'required'=> false,
'placeholder'=>' - '
))
- > add('test','text',array(
'mapped'=> false,
'required'=& se
))
- > add('assignedTo','entity',array(
'class'=> 'ftiwebBundle:Employees',
'query_builder'=>函数(EntityRepository $ er){
return $ er-> createQueryBuilder('e')
- >其中('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')
- >其中('e.active = 1')
- > orderBy('e.lastname','ASC');
}
,
'multiple'=> false,
'expanded'=> false,
'占位符'=>' - ',
))
- > add('notes','textarea')
- > add('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();
}
返回的错误是:
执行' INSERT INTO指标(baseline,testEvent,status,shotStart,shotEnd,c2p,notes,date,ui,assignedTo)VALUES(?,?,?,?,?,?,?,?,?,?) foo,foo,null,2015-03-03 00:30:00,2015-03-03 02:30:00,foo,test,null,18,21] :
如你所见,主键(uniqueId)不在要插入的列中,这导致我相信它的映射
任何帮助将非常感谢
感谢所有的帮助。最终答案是,在orct.xml的orm.xml文件中,生成的值永远不会改变,我在xml文档中手动删除了generatevalue。之后,插入DML语句工作正常,我看到DB中的行。 orm.xml文件位于Bundle / Resources / config / doctrine目录中。
I am working on a PHP Project, utilizing Symfony 2, and Doctrine as ORM. When I persist and flush the object the primary key column is not even in the insert SQL DML Statement, and of course an error is thrown. The ID is a generated value, using PHP's uniqid. I will provide the Entity and a code snippet of the controller.
/**
* 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;
}
I left out the getters and setters for clarity.
$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();
}
The error that returns is: An exception occurred while executing 'INSERT INTO metrics (baseline, testEvent, status, shotStart, shotEnd, c2p, notes, date, ui, assignedTo) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["foo", "foo", null, "2015-03-03 00:30:00", "2015-03-03 02:30:00", "foo", "test", null, 18, 21]:
As you see, the primary key (uniqueId) is not in the columns to be inserted, which leads me to believe its mapping Any help would be greatly appreciated
Thanks for all the help guys. The answer ended up being, in the orm.xml files for doctrine, the generatedvalue would never change, I manually removed the generatedvalue, in the xml document. After this, the insert DML statement worked correctly, and I see the row in my DB. The orm.xml file is in the Bundle/Resources/config/doctrine directory.
这篇关于当flush()主键未插入时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!