Doctrine orm 条令2查询生成器

Doctrine orm 条令2查询生成器,doctrine-orm,Doctrine Orm,假设以下两个表为“用户”和“朋友” 'user' column: id column: name 'friends' column: user_id column: user2_id friends表中的两列都对应于user table id列 现在,我可以简单地通过以下部分名称查找用户: $query='jim'; $result=$em->getRepository('\User\Entity\User') ->createQueryBuilder('u')

假设以下两个表为“用户”和“朋友”

'user'
column: id
column: name

'friends'
column: user_id
column: user2_id
friends表中的两列都对应于user table id列

现在,我可以简单地通过以下部分名称查找用户:

$query='jim';
$result=$em->getRepository('\User\Entity\User')
        ->createQueryBuilder('u')
        ->where('u.name like :match')
        ->setParameter('match', $query.'%')
        ->setMaxResults(5)
        ->getQuery()
        ->getResult();
现在假设一个对象是\User\Entity\User userA,我如何为userA已经不是朋友的所有用户进行部分字符串匹配

编辑添加了实体定义
我们将分两步来做。首先,我们找出哪些用户是他们的朋友,然后我们做一个排除他们的查询

首先,我们检索用户朋友的ID列表:

$friendIds = $em->createQuery("
    SELECT IDENTITY(uf.user)
    FROM User\Entity\UserFriends uf
    WHERE uf.user = :id")
->setParameter("id", $userId) // $userId is the ID of the target user
->getResult();

$friendIds = array_map("current", $friendIds); // needed for flattening the array
现在我们只需查询用户表,不包括我们朋友的ID:

$notMyFriends = $em->createQuery("
    SELECT u
    FROM User\Entity\User u
    WHERE u.id != :ownid 
    AND WHERE u.id NOT IN (:friends)")
->setParameter("ownid", $userId) // $userId is the ID of the target user
->setParameter("friends", $friendIds)
->getResult();
我在这里使用的是普通的DQL,但是如果您更喜欢查询生成器,还可以将其重写为QB方法链

(以上都是我的想法,希望它能起作用。如果不能,请留下评论,我会尽力解决。)


顺便说一下,关于实体类,请允许我给您一些提示:

  • 实体类应始终使用单数
    UserFriends
    → <代码>用户朋友

  • 所有的
    name=“foobar”
    注释参数都是多余的,因为条令会自动命名表、索引和列

  • JoinColumns
    …您可以完全忽略它们,除非您想明确地更改默认行为(通常不这样做)

  • nullable=true
    是xToOne关系的默认值,因此也可以省略它

  • nullable=false
    unique=false
    在ID字段上没有意义。第一个是多余的,第二个是不可能的


请您发布实体定义,而不是表列。干杯,我会尝试一下,然后再报告。关于其他建议,实体是根据数据库表中的条令自动生成的。很高兴我能提供帮助。它是这样工作的还是你修改了我的代码?如果是这样的话,请用你的补丁更新我的答案,这样下一个家伙也能从中受益。首先,我对数据库查询不是特别精通。我最初的解决方案是根据您的解决方案使用两个查询。我认为这可能是低效的,所以我在这里发布,看看是否有比我更精通的人可以通过一个查询提供解决方案。你的回答证实了我已经拥有的东西;两个问题。我想我在这里只是为了确认一个查询是不可能的。事实上,我认为可以通过一个连接来完成。但是,老实说,要发布一个有用到一半的示例,我必须实现一个测试用例,但我太懒了。检查我的帖子的修订历史记录。;)
$notMyFriends = $em->createQuery("
    SELECT u
    FROM User\Entity\User u
    WHERE u.id != :ownid 
    AND WHERE u.id NOT IN (:friends)")
->setParameter("ownid", $userId) // $userId is the ID of the target user
->setParameter("friends", $friendIds)
->getResult();