向数组集合添加不同的值

时间:2017-10-30 16:40:14

标签: symfony unique arraycollection

在我的应用程序中,我向不同的用户发送通知,这些用户被分配给分配给文档的代理商。因此,无论何时创建文档并将代理分配给该文档,属于该代理的所有用户都应该收到通知。问题是:可能会发生这样的情况:用户被分配到多个代理商,因此每当通知发出并且所有代理商都被分配到文档时,他都会多次收到通知。我想避免这种情况,但我无法弄清楚如何只在我的数组中添加不同的对象,因为它看起来不像 array_unique < / strong>功能。

到目前为止它看起来像是:

 foreach($document->getAgencies() as $agency) {
     if(count($agency->getUseragencies()) > 0){
      $users = $agency->getUseragencies();
      foreach ($users as $user){
      ... notifications are generated
      $manager->addNotification($user, $notif);
     }
  }
}

任何帮助将不胜感激! 哦和背景信息:代理商是一个自己的实体,以及用户是,他们是多对多的关系!

修改 映射信息: 在实体代理商

/**
* @ORM\ManyToMany(targetEntity="UserBundle\Entity\User", mappedBy="agencies")
**/
private $useragencies;
实体用户

中的

        /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agency", inversedBy="useragencies", cascade={"persist"})
     * @ORM\JoinTable(name="user_user_agencies",
     *   joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *   inverseJoinColumns={@ORM\JoinColumn(name="iata8", referencedColumnName="iata8")})
     * @var \AppBundle\Entity\Agency
     **/
    private $agencies;



        /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Notification", mappedBy="user", orphanRemoval=true, cascade={"persist"})
     **/

    private $notifications;

4 个答案:

答案 0 :(得分:1)

虽然您无法在in_array()上使用ArrayCollection,但您必须构建自己的唯一身份用户数组。

$users = array();

foreach($document->getAgencies() as $agency) {
    if(count($agency->getUseragencies()) > 0) {
        foreach ($agency->getUseragencies()as $user) {
            // ... notifications are generated
            if(!in_array($user->getId(), $users)) {
                $users[] = $user->getId();
            }
        }

        foreach($users as $userId) {
            $manager->addNotification($userId, $notif);
        }
    }
}

或更简单,成本更低的版本:

$sent = array();

foreach($document->getAgencies() as $agency) {
    if(count($agency->getUseragencies()) > 0) {
        foreach ($agency->getUseragencies()as $user) {
            // ... notifications are generated
            if(!in_array($user->getId(), $sent)) { // check if user has already been sent the notification
                $manager->addNotification($user, $notif); // send the notification
                $sent[] = $user->getId(); // add user to the 'sent' list 
            }
        }
    }
}

或者,通过编写custom DQL查询(可能在您的UserRepository类中)直接从数据库中获取用户列表,可以省去很多麻烦。通过完全消除对循环的需要,这将消除代码中的大量复杂性。

答案 1 :(得分:1)

我假设您的Agency实体也与Document实体进行双向映射,我猜为ManyToMany。要获得您想要发送属于多个代理商和代理商的通知的用户可以拥有许多文档,您可以在DQL下方通过提供文档ID来获取不同的用户,如果您有任何其他属性来标识您可以调整的文档因此WHERE条款

SELECT DISTINCT u
FROM YourBundle:User u
JOIN u.agencies a
JOIN a.documents d
WHERE d.id = :documentid

使用查询构建器,它将类似于

$user = $em->getRepository('YourBundle:User'); 
$user = $user->createQueryBuilder('u')
        ->select('u')
        ->join('u.agencies','a')
        ->join('a.documents','d')
        ->where('d.id = :documentid')
        ->setParameter('documentid', $documentid)
        ->distinct()
        ->getQuery();
$users= $user->getResult();

答案 2 :(得分:1)

ArrayCollection有一个您可以使用的方法contains - link

答案 3 :(得分:0)

您需要添加一个条件来处理数组中已有的值。尝试添加以下条件。

foreach($user as $user){
if(!in_array($value, $list, true))