This is more of a workaround than a solution.
First, in your controller, you have to manually link section to ArticlePosition before you invoke $form->isValid().
$entity = new ArticlePosition();
$entity->setSection($section);
...
$form->handleRequest($request);
if ($form->isValid()) {
...
}
Second, you have to specify a custom repository method for the Unique constraint.
# validation.yml
Acme\DefaultBundle\Document\ArticlePosition:
constraints:
- Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique:
fields: [section, position]
repositoryMethod: findUniqueBy
and in your ArticlePositionRepository
public function findUniqueBy($criteria)
{
$section = $criteria['section'];
$position = $criteria['position'];
return $this->findBy(array('section.id' => $section, 'position' => $position));
}
The key is here is to add .id for reference fields in findBy for Mongodb to correctly query the result.