当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();
    } 

返回的错误为:执行"INSERT INTO metrics(baseline,testEvent,status,shotStart,shotEnd,c2p,notes,date,ui,assignedTo)VALUES(

正如您所看到的,主键(uniqueId)不在要插入的列中,这让我相信它的映射如有任何帮助,将不胜感激

您应该玩@ORM'GeneratedValue(strategy="NONE"),您可以从以下选项中选择:AUTO, SEQUENCE, TABLE, IDENTITY, UUID, CUSTOM and NONE.

我使用AUTO-告诉Doctrine选择所使用的数据库平台首选的策略。优选的策略是MySQLIDENTITYSQLiteMsSQL以及OraclePostgreSQLSEQUENCE。这种策略提供了完全的可移植性。

如果您正在使用PHP uniqueid生成,请使用下一个工作站:

/**
 * @ORM'Column(type="guid")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="UUID")
 */

感谢大家的帮助。答案是,在原则的orm.xml文件中,generatedvalue永远不会改变,我手动删除了xml文档中的generatedvalue。在此之后,insert DML语句正常工作,并且我在DB中看到了该行。orm.xml文件位于Bundle/Resources/config/domine目录中。