2014-09-06 33 views
0

我有一个多对一关联映射,许多考试有一个科 如果我要更新标记 我用主义那里条件多对一

Update namespace/Exam e set e.marks = 4 where e.subject.id = xxxx 

它与考试编号XXXX所有学科的性质没有工作 你能请他 帮助我以正确的方式做到这一点?

+0

什么你想知道吗?你的问题是什么?? – 2014-09-06 07:56:57

+0

嗨,我更新了关于你的第二个问题的答案。这是你的意思吗?如果它对你有帮助,你可以接受答案是正确的;-) – SBH 2014-09-09 17:37:48

回答

1

如果在查询中没有加入,则无法访问e.subject.id。但是在Doctrine更新语句中,由于其特定的MySQL,联接是不可能的。

什么工作,应该是比较全的实体:

$subject = $this->getEntityManager()->getRepository('namespace\subject') 
    ->find(xxx); 

$query = $this->getEntityManager()->createQueryBuilder() 
    ->update('namespace\Exam', 'e') 
    ->set('e.marks', '4') 
    ->where('e.subject = :subject') 
    ->setParameter('subject', $subject); 

或者,如果你不希望有其他数据库查询与被摄物的实体的主键仅包含一列(如id ),你也可以用这个主键比较:

$query = $this->getEntityManager()->createQueryBuilder() 
    ->update('namespace\Exam', 'e') 
    ->set('e.marks', '4') 
    ->where('e.subject = :id') 
    ->setParameter('id', xxx); 

也看看this question,用户无法在他的更新语句加入了。

编辑:增加了更多的一般的方法

+0

如果财产不是身份,那我们该怎么办? – Sagar 2014-09-07 04:20:28

+0

你的意思是如果主键由多个列组成?在这种情况下,您可以与完整的主题对象进行比较。 – SBH 2014-09-07 18:12:16