Doctrine 2 QueryBuilder

问题描述 投票:0回答:1

假设有以下两个表,'user'和'friends';

'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 not 已经是朋友的所有用户进行部分字符串匹配?

编辑添加了实体定义

/**
 * 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;
}`
php doctrine-orm
1个回答
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 字段上没有意义。第一个是多余的,第二个是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.