我无法在DQL中写好我的学说查询

时间:2019-04-11 06:37:47

标签: sql symfony doctrine dql

作为一个伟大的Symfony初学者,因此也是我的学说,我遇到两个需要做的查询。

我有一个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行,“ packages FROM”附近的第9列:错误:无效   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:错误:预期字面量为')'

关于此:

  

返回$ queryBuilder-> getQuery()-> getResult();

2 个答案:

答案 0 :(得分: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();
}

因此,您不需要第一个功能。

答案 1 :(得分: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