【问题标题】:Doctrine2: check if exists value in Doctrine CollectionDoctrine2:检查Doctrine Collection中是否存在值
【发布时间】:2015-01-31 14:56:51
【问题描述】:

如何检查 Doctrine Collection(ManyToMany 关系)字段中是否存在给定值?

例如我尝试:

$someClass = $this->
             getDoctrine()->
             getRepository('MyBundle:MyClass')->
             find($id);

if (!$entity->getMyCollectionValues()->get($someClass->getId())) {

    $entity->addMyCollectionValue($someClass);

}

但这当然是不正确的。那么,如何避免重复键呢?

【问题讨论】:

    标签: symfony doctrine-orm arraycollection


    【解决方案1】:

    你可以这样做:

    $object = $this->getDoctrine()->getRepository('MyBundle:MyClass')->find($id);
    
    if ( !$entity->getMyCollectionValues()->contains($object) ) {
        $entity->addMyCollectionValue($object);
    }
    

    您可以在http://www.doctrine-project.org/api/common/2.1/class-Doctrine.Common.Collections.ArrayCollection.html 中查看 Doctrine ArrayCollection 的可用功能

    【讨论】:

    • 当我们已经拥有该对象的 id 时,是否有一种 Doctrine 方法可以在开始时不执行另一个查询来获取我们正在搜索的对象进行检查?为什么我不能询问该集合是否有具有该 ID 的条目?我不同意为此添加另一个查询。
    • @grantwparks 如果您总是想确保在添加之前进行检查,您可以将 contains() 放在 add 方法中。
    • @grantwparks 是的,您可以使用$object = $em->getReference('MyBundle:MyClass', $id) 获取实体引用,如果实体已经在缓存中,它将返回引用,如果不在缓存中,则返回惰性引用。调用 $object->getId() 不会导致实体加载,这是我假设 contains() 使用的。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2016-06-17
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多