我正在使用Symfony 2.7,我用一个实体构建了一个表单,该实体在提交时返回一个对象数组。我需要能够将此对象数组与该表中的对象进行比较?
所以这就是我设置表单的方式
$builder
.......
->add('my_options', 'entity', [
'label' => 'Options:',
'class' => 'xxxxBundle:Details',
'choice_label' => 'Title',
'multiple' => true,
'expanded' => true,
'required' => false,
'mapped' => false,
'data' => $data,
'attr' => ['class' => 'AdminList'],
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('de')
->where('de.active = ?1')
->setParameter(1, 1); }
]);
然后,我对我的选项表已经得到的内容进行基本查找,
$EditPanels = $this->getDoctrine()
->getRepository('xxxBundle:Options')
->findBy(['AccountID' => $AcID]);
这给了我两个数组,一个是用户刚刚选择的(他们现在需要此帐户的选项),另一个是数据库表中已有的内容。
如何比较这些表以使用新选项更新行,方法是删除不需要的内容并添加新选项?
谢谢。
$newIds = array_map($formData, function (Details $d) {
return $d->id;
});
$oldIds = array_map($EditPanels, function (Details $d) {
return $d->id;
});
$shouldBeRemoved = array_diff($oldIds, $newIds);
$shouldBeAdded = array_diff($newIds, $oldIds);
现在,您拥有需要更改的选项的所有 ID。希望这有帮助。
我认为您甚至不应该查询现有记录。相反,您可以:
保留所有新记录并更新现有记录:
foreach ($new as $object) {
if ($object->getId() === null) {
$em->persist($object);
}
}
$em->flush();
从数据库中删除所有其他记录:
$qb = $em->getRepository('xxxxBundle:Details')->createQueryBuilder();
$qb->delete()->where($qb->expr()->notIn('id', array_column('id', $new)));
附言不确定语法,但你明白了。