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
是xToOne关系的默认值,因此也可以省略它nullable=true
和nullable=false
在ID字段上没有意义。第一个是多余的,第二个是不可能的unique=false
$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();