当flush()主键未插入时

编程入门 行业动态 更新时间:2024-10-28 02:31:07
本文介绍了当flush()主键未插入时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我正在从事PHP项目,利用Symfony 2和Doctrine作为ORM。当我持久化并刷新对象时,主键列在插入SQL DML语句中并不均匀,当然也会引发错误。 ID是一个生成的值,使用PHP的uniqid。 我将提供实体和控制器的代码片段。

/ ** *指标 * * @ 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()主键未插入时

本文发布于:2023-10-26 10:13:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1529838.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:入时   主键   flush

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!