0

我有两个实体用户和类别,它们通过多对多关系相互连接。

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

现在我需要向我的 Category 实体添加额外的字段 - user_counter,它存储与其链接的用户数量。每次用户添加、更新或删除他与类别的关系时,都应该更新它。

一个想法是在用户实体中创建方法,该方法将在保存管理表单之前获取他的类别,将它们与当前输入进行比较,然后做出决定(类别计数器使 +1 或 -1)。并通过生命周期回调(prePersist 和 preUpdate)开启这个方法。

问题:我的代码将获取所有用户类别并将它们与每个表单保存时的当前输入进行比较。我怎样才能避免这样的开销?也许这个任务还有另一种解决方案?

谢谢你的帮助。

4

1 回答 1

2

您可以跟踪的一种方法是修改实体中的收集方法。例如:

/*
 * @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 回答