当我合并以下使用复合索引的分离的UserAnswer对象时,如果并且仅当我在对象中有一个为外键/映射实体和为非外键/映射实体的索引时,合并才会失败。如果复合索引只包括外键或只包括非外键,则合并有效。
我认为这是一个Doctrine2错误。如果没有,我做错了什么?
Doctrine2版本:2.3.4
下面的控制器代码保存UserAnswer对象类型,在以下代码块中进行了描述:
$entityManager = $this->getDoctrine()->getManager();
$userAnswer = new UserAnswer();
$userAnswer->setUser($this->getUser());
$userAnswer->setAnswerType(1);
$userAnswer->setQuestion($entityManager->getReference('AcmeBundle:Question',1));
$entityManager->detach($userAnswer);
$entityManager->merge($userAnswer);
try {
$entityManager->flush();
} catch (DoctrineDBALDBALException $e) {
...
UserAnswer对象:
/**
* @ORMEntity
* @ORMTable(name="userAnswers")
*/
class UserAnswer
{
/**
* @ORMId
* @ORMManyToOne(targetEntity="User")
*/
protected $user;
/**
* @ORMId
* @ORMManyToOne(targetEntity="Question")
*/
protected $question;
/**
* @ORMId
* @ORMColumn(name="answer_type", type="integer")
*/
protected $answer_type;
...
这是我收到的错误:
的查询缺少标识符answer_typeAcmeBundle\Entity\UserAnswer
500内部服务器错误-ORMException
堆栈跟踪
在/流浪者/Symfony/vender/doctory/orm/lib/Doctory/orm/ORMException.php在第160行-
public static function missingIdentifierField($className, $fieldName) { return new self("The identifier $fieldName is missing for a query of " . $className); } public static function overwriteInternalDQLFunctionNotAllowed($functionName)
在ORMException处::在第380+行的/foarant/Symfony/vvendor/domeric/orm/lib/doctrine/orm/EntityManager.php中缺少IdentifierField('Acme\Entity\UserAnswer','swer_type')
在EntityManager->find('Acme\Entity\UserAnswer',array('user'=>'1','question'=>'1')),位于/varrant/Symfony/vendor/domaine/orm/lib/doctrine/OM/UnitOfWork.php的1787+行
在UnitOfWork->doMerge(object(UserAnswer),array('00000000025cf950300000006ed40a0a'=>object
在UnitOfWork->merge(object(UserAnswer))中,位于/advant/Symfony/vendor/domine/orm/lib/doctrine/OM/EntityManager.php的638+行
在EntityManager->merge(object(UserAnswer))中,位于第23+行的/varrant/Symfony/src/Acme/Controller/UserAnswerController.php
在kernel.root_dir/bootstrap.hp.cache中的call_user_func_array(array(object(UserAnswerController),'postAction'),array())的2815+行
在kernel.root_dir/bootstrap.hp.cache中的HttpKernel->handleRaw(对象(请求),'1'),第2789+行
在kernel.root_dir/bootstrap.hp.cache的第2918+行的HttpKernel->句柄(object(Request),'1',true)
在kernel.root_dir/bootstrap.hp.cache中的ContainerwareHttpKernel->句柄(对象(请求),'1',true),位于2220+行
在Kernel->handle(object(Request))中,位于/advant/Symfony/web/app_dev.php的第31行+
此UserAnswer不会产生上述控制器代码的错误:
/**
* @ORMEntity
* @ORMTable(name="userAnswers")
*/
class UserAnswer
{
/**
* @ORMId
* @ORMManyToOne(targetEntity="User")
*/
protected $user;
/**
* @ORMId
* @ORMManyToOne(targetEntity="Question")
*/
protected $question;
/**
* @ORMColumn(name="answer_type", type="integer")
*/
protected $answer_type;
...
这个也没有:
/**
* @ORMEntity
* @ORMTable(name="userAnswers")
*/
class UserAnswer extends ApiObject
{
/**
* @ORMId
* @ORMColumn(name="userid", type="integer")
*/
protected $userid;
/**
* @ORMId
* @ORMColumn(name="question_id", type="integer")
*/
protected $question_id;
/**
* @ORMId
* @ORMColumn(name="answer_type", type="integer")
*/
protected $answer_type;
...
这个是Doctrine2错误,在Doctrine2.4.2版本中修复,截至本文撰写之时,该版本尚未发布。(请参见http://www.doctrine-project.org/jira/browse/DDC-2645.)
然而,修复程序非常易于实现:https://github.com/Exeu/doctrine2/commit/edab2b6a9670dda3127f457205c7720611d6a6c9
看起来这可能与一个已知的条令问题有关,并在2.3.4:版本中修复
http://www.doctrine-project.org/jira/browse/DDC-2645