Symfony 2 / PHP比较数组中对象的差异


Symfony 2 / PHP compare the difference of objects in arrays?

我正在使用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)));

附言不确定语法,但你明白了。