2016-04-25 5 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]); 

は、これは私に2つの配列のいずれかを提供しますユーザーが今選択したばかりのオプション(このアカウントで必要なオプション)と、データベーステーブルに既にあるものとを比較します。

これらのテーブルを比較して、新しいオプションで行を更新するには、不要なものを削除して新しいオプションを追加します。

ありがとうございました。

答えて

1

私は、既存のレコードについても照会すべきではないと思います。代わりに、次のことができます。

は、すべての新しいレコードを永続化し、既存の更新:

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

P.S.:

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

は、データベースから他のすべてのレコードを削除します構文に関してはわかりませんが、あなたはその考えを持っています。

+0

こんにちは、どのようにこれが動作するか、私はアイデアが好きですが、$オブジェクトはまだエンティティにバインドする必要がありますか?これは別のフォームエンティティから来ていますか?私はこれがより良い方法だと確信していますが、それで走る方法を見ることはできません。 –

+0

ああ申し訳ありませんが、オプションと詳細の2つの異なるエンティティがあります。単にテーブルをクリアして新しいレコードとして新しいデータを挿入するのはどうですか?パフォーマンスに大きな影響を与えるべきではありませんが、アプリケーションのロジックを単純化してください。 –

+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_reduce'の代わりに' array_map'を使いたいとします。 – moonwave99

+0

@ moonwave99:そうです、ありがとうございます。私は答えを変えました。 – colburton

+0

こんにちはみんな、ありがとう - 私はこれを今行く! –

関連する問題