假设有以下两个表,'用户'和'朋友';
'user'
column: id
column: name
'friends'
column: user_id
column: user2_id
friends表中的两列对应于用户表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 而不是朋友的所有用户进行部分字符串匹配?
/**
* User
*
* @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="name_key", columns={"name"})})
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", precision=0, scale=0, nullable=false, unique=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, precision=0, scale=0, nullable=false, unique=false)
*/
private $name;
}
/**
* UserFriends
*
* @ORM\Table(name="user_friends", indexes={@ORM\Index(name="user_id_key", columns={"user_id"}), @ORM\Index(name="friend_user_id_key", columns={"friend_user_id"})})
* @ORM\Entity
*/
class UserFriends
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", precision=0, scale=0, nullable=false, unique=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \User\Entity\User
*
* @ORM\ManyToOne(targetEntity="User\Entity\User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="friend_user_id", referencedColumnName="id", nullable=true)
* })
*/
private $friendUser;
/**
* @var \User\Entity\User
*
* @ORM\ManyToOne(targetEntity="User\Entity\User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true)
* })
*/
private $user;
}`
答案 0 :(得分:0)
我们将分两步完成。首先,我们找出他们 朋友的用户,然后我们查询排除他们。
首先,我们检索用户朋友的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
→UserFriend
。
所有name="foobar"
注释参数都是多余的,因为Doctrine会自动为您的表,索引和列命名。
同样适用于JoinColumns
...你可以完全省略它们,除非你想明确地改变默认行为(你通常不会这样做)。
nullable=true
是xToOne关系的默认值,因此也可以省略。
nullable=false
和unique=false
对ID字段没有意义。第一个是多余的,第二个是不可能的。