我不能在DQL中写好我的学说查询

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

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

我有一个User表,其中包含与Packages实体的ManyToMany关系。 (创建“packagesDDLUser”表)

在我的用户实体中,我有一个“包”字段。

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

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

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

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

所以,我:

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

    }

但我有这个错误:

[语义错误]第0行,第9行附近'packages FROM':错误:无效的PathExpression。必须是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();
    }

但我有这个错误

[语法错误]第0行,第65行:错误:预期文字,得到')'

在这:

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

sql symfony doctrine dql
2个回答
1
投票

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

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();
}

所以,你不需要第一个功能。


0
投票

对于第一个你需要加入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

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