Я использую 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
C0ol_Cod3r 25 Апр 2016 в 14:00

2 ответа

Лучший ответ

Я думаю, вам не следует даже запрашивать существующие записи. Вместо этого вы можете:

Сохранять все новые записи и обновлять существующие:

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. Не уверен в синтаксисе, но идея у вас есть.

1
Andrey Mischenko 25 Апр 2016 в 12:13
    $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);

Теперь у вас есть все идентификаторы для параметров, которые необходимо изменить. Надеюсь это поможет.

2
colburton 25 Апр 2016 в 12:28