当flush()主键未插入时 [英] when flush() primary key does not get inserted

查看:112
本文介绍了当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()主键未插入时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆