我不能用 DQL 写好我的学说查询

I can't write well my doctrine queries in DQL

作为一个伟大的 Symfony 初学者和 Doctrine,我有两个问题需要做。

我有一个用户 table,它包含与包实体的多对多关系。 (创建 "packagesDDLUser" table)

在我的用户实体中,我有一个 "packages" 字段。

我的用户下载包。当发生这种情况时,下载的包被插入到数据库中的 "packagesDDLUser" 实体中,例如 "user_id, package_id".

我想要做的是能够在页面上显示不属于用户已链接到的软件包的软件包列表。

基本上,当用户下载包时,将其显示在可下载包列表中不再有用。

我有两个请求。一个将使用用户的 id 参数收集用户下载的包。另一个应该 select 不属于该列表的软件包列表。

所以,我已经:

public function getPackagesUser($id)
    {
        $queryBuilder = $this->createQueryBuilder("u")
        ->select("u.packages")
        ->where("u.id = :id")
        ->setParameter("id", $id);
        return $queryBuilder->getQuery()->getResult();

    }

但是我有这个错误:

[Semantical Error] line 0, col 9 near 'packages FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

我的第二个查询:

public function getPackagesNotUser($packagesUser)
    {
        $qb = $this->createQueryBuilder('p');
        $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

        return $queryBuilder->getQuery()->getResult();
    }

有人可以帮助我吗?我不太了解 Doctrine,它对我来说很新

谢谢

编辑:

好的,现在我已经:controller.php

 $user = $this->getUser();
 $packagesUser = $user->getPackages()->toArray();
$packagesView = $this->getDoctrine()->getRepository('PagesBundle:Paquet')->getPackagesNotUser($packagesUser);

存储库:

public function getPackagesNotUser($packagesUser)
    {
        $qb = $this->createQueryBuilder('p');
        $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

        return $queryBuilder->getQuery()->getResult();
    }

但是我有这个错误

[Syntax Error] line 0, col 65: Error: Expected Literal, got ')'

对此:

return $queryBuilder->getQuery()->getResult();

首先,你不能直接select像这样[在你的第一个函数中]打包。 你必须加入。例如:

public function getPackagesUser($id)
{
   $queryBuilder = $this->createQueryBuilder("u")
        ->join("u.packages", "packages")
        ->where("u.id = :id")
        ->setParameter("id", $id);

   return $queryBuilder->getQuery()->getResult();

}

其次,您的第二个函数听起来必须将用户对象作为参数传递。 类似于:

public function getPackagesNotUser(User $user)
{
    $packagesUser = $user->getPackages()->toArray();
    $qb = $this->createQueryBuilder('p');
    $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

    return $queryBuilder->getQuery()->getResult();
}

所以,你不需要第一个函数。

您需要在 u.packages 加入第一个 应该是这样的

<?php

public function getPackagesUser($id)
    {
        $queryBuilder = $this->createQueryBuilder("u")
        ->select("p")
        ->join("u.packages", "p")
        ->where("u.id = :id")
        ->setParameter("id", $id);
        return $queryBuilder->getQuery()->getResult();

    }

对于第二个,我从未使用过 notIn,但我在堆栈溢出中发现了一些可能对您有帮助的东西。

How can I fetch every row where column is not in (array of values) with Doctrine?

Array not in array for doctrine query