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

时间:2016-04-25 11:00:22

标签: php arrays symfony

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

这给了我两个数组,其中一个是用户刚刚选择的(这个帐户现在需要的选项)和一个已经存在于数据库表中的数组。

如何通过删除不需要的内容并添加新选项来比较这些表以使用新选项更新行?

感谢。

2 个答案:

答案 0 :(得分:1)

    $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。希望这会有所帮助。

答案 1 :(得分:1)

我认为您甚至不应该查询现有记录。相反,你可以:

保留所有新记录并更新现有记录:

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)));

P.S。不确定语法,但你明白了。