2016-04-25 87 views
2

我正在使用Symfony 2.7我已經用一個實體構建了一個表單,它在提交時返回一個對象數組。我需要能夠比較這個對象數組與我在那個表中有什麼?Symfony 2/PHP比較數組中對象的區別?

所以這是我的形式爲設置

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

這給了我兩個數組的一個用戶剛剛選擇了哪些選項(他們現在需要在此帳戶上選擇的選項)以及數據庫表中已有的選項。

如何比較這些表更新與新的選項行,通過刪除什麼不需要,並在新選項加入?

謝謝。

回答

1

我想你甚至不應該查詢現有的記錄。相反,您可以:

堅持所有的新記錄和更新現有:

$qb = $em->getRepository('xxxxBundle:Details')->createQueryBuilder(); 
$qb->delete()->where($qb->expr()->notIn('id', array_column('id', $new))); 

附註:

foreach ($new as $object) { 
    if ($object->getId() === null) { 
     $em->persist($object); 
    } 
} 
$em->flush(); 

從數據庫中刪除所有其他記錄不確定語法,但你有想法。

+0

嗨,不知道這將如何工作,我喜歡這個主意,但$對象仍然需要綁定到一個實體?這是否構成另一個表單實體?我相信這是一個更好的方法,但不知道如何運行它。 –

+0

哦,對不起,現在我看到有兩個不同的選項和細節實體:)那麼簡單地清除表格並插入所有新數據作爲新記錄呢?它不應該對性能產生很大影響,但會簡化應用程序的邏輯。 –

+0

現在這是一個想法...我專注於更新表。但刪除所有X = X,然後添加新的。我放棄了。我會這樣做,我做了一個工作解決方案(我不會發布的東西)它是非常糟糕的:( –

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。希望這可以幫助。

+0

你想使用'array_map'而不是'array_reduce'。 – moonwave99

+0

@ moonwave99:你說得對,謝謝。我已經改變了答案。 – colburton

+0

嗨,大家好,非常感謝 - 我現在就放棄! –