0

User と Category という 2 つのエンティティがあり、これらは多対多の関係で相互に接続されています。

manyToMany:
    categories:
      targetEntity: Category
      joinTable:
        name: users_categories
        joinColumns:
          user_id:
            referencedColumnName: id
        inverseJoinColumns:
          category_id:
            referencedColumnName: id

私の UserAdmin.php (私は Sonata Admin および Sonata User バンドルを使用しています) では、次のフィールドで処理されます。

->add('categories', 'sonata_type_model', array('required' => false, 'expanded' => false, 'multiple' => true, 'label' => 'Chose your categories'))

ここで、カテゴリ エンティティに追加のフィールドを追加する必要があります。user_counter は、それにリンクされたユーザー数を格納します。ユーザーがカテゴリとの関係を追加、更新、または削除するたびに更新する必要があります。

1つのアイデアは、管理フォームを保存する前にカテゴリを取得し、それらを現在の入力と比較してから決定するユーザーエンティティでメソッドを作成することでした(+1または-1を作成するカテゴリカウンター)。そして、このメソッドを lifecycleCallbacks (prePersist および preUpdate) でオンにします。

問題: 私のコードはすべてのユーザー カテゴリを取得し、フォームを保存するたびにそれらを現在の入力と比較します。このようなオーバーヘッドを回避するにはどうすればよいですか? たぶん、このタスクには別の解決策がありますか?

ご協力ありがとう御座います。

4

1 に答える 1

2

追跡できる1つの方法は、エンティティの収集メソッドを変更することです。例えば:

/*
 * @ORM\Column(name="user_counter", type="integer")
 */
 protected $user_counter;

public function addUser(User $user) 
{
    $this->users[] = $user;
    $this->user_counter++;
}

public function removeUser(User $user)
{
    $this->users->remove($user);
    $this->user_counter--;
}

または、データベース内のカウントが必要ない場合は、$ category-> getUsers()-> count();を実行します。

編集:

エンティティセッターを変更する代わりに、イベントリスナーを使用してこれを追跡する場合は、ととの組み合わせを使用$unitOfWork->getScheduledCollectionUpdates()getDeleteDiff()ますgetInsertDiff()

于 2013-01-12T18:24:31.193 に答える