如何使用表数据库生成dql请求不是实体

时间:2017-04-04 16:30:05

标签: symfony dql

我想了解为什么我的DQL请求不起作用。我要实体:书籍(ouvrages)和作者(auteurs),有很多关系,所以在我的数据库中,连接表是创建books_authors(ouvrages_auteurs),彼此引用“id”。我想使用这个连接表来获取我的两本实体书籍和作者的所有信息。

我在BooksRepository中提出了很多请求,但它不起作用:

public function getOuvrageTradeByAuteur(array $autor){
    $query = $this->getEntityManager()->createQuery("SELECT o,a FROM SBMainBundle:Ouvrages o JOIN ouvrages_auteurs oa JOIN SBMainBundle:Auteurs a WHERE o.is_trade = true  AND o.id = oa.ouvrages_id AND oa.auteurs_id = a.id AND a.nom_auteur = :autor")
                    ->setParameter('autor',$autor);
    return $query->getResult();
}

public function getBooksTradeByAutor(array $autor){
    //requete DQL pour un many to many
    $query = $this->createQueryBuilder('o');
    $query->join('o.auteur','auteurs')
            ->where($query->expr()->in('auteurs.nomAuteur',$autor))
            ->andWhere('o.isTrade = true')
            ->orderBy('o.id','desc')
            ->addSelect('o,auteurs');
    return $query->getQuery()->getResult();
}

public function getBooksSellByAutor(array $autor){
    //requete DQL pour un many to many
    $query = $this->createQueryBuilder('o');
    $query->join('o.auteur','auteurs')
        ->where($query->expr()->in('auteurs.nomAuteur',$autor))
        ->andWhere('o.isSell = true')
        ->orderBy('o.id','desc')
        ->addSelect('o,auteurs');
    return $query->getQuery()->getResult();
}

public function getOuvragesEchangesByAutor($auteurs){
    //requete en DQL 2eme partie
    $query = $this->createQueryBuilder('o')->where('o.auteur = :autor')
                                            ->andWhere('o.isTrade = true')
                                            ->join('o.auteur','a')
                                            ->setParameter('autor',$auteurs)
                                            ->orderBy('o.id','desc')
                                            ->addSelect('a');
    return $query->getQuery()->getResult();
}

public function getOuvragesVentesByAutor($auteurs){
    //requete en DQL 2eme partie
    $query = $this->createQueryBuilder('o')->where('o.auteur = :autor')
                                            ->andWhere('o.isSell = true')
                                            ->join('o.auteur','a')
                                            ->setParameter('autor',$auteurs)
                                            ->orderBy('o.id','desc')
                                            ->addSelect('a');
    return $query->getQuery()->getResult();
}

编辑错误消息:

[语义错误]第0行,第45行'ouvrages_auteurs'附近:错误:未定义类'ouvrages_auteurs'。

500内部服务器错误 - QueryException 1个链接异常: QueryException»

[2/2] QueryException:[语义错误]第0行,第45行'ouvrages_auteurs'附近:错误:未定义类'ouvrages_auteurs'。

[1/2] QueryException:SELECT o,FROM SBMainBundle:Ouvrages o JOIN ouvrages_auteurs oa JOIN SBMainBundle:Auteurs a WHERE o.is_trade = true AND o.id = oa.ouvrages_id AND oa.auteurs_id = a.id AND a.nom_auteur =:autor

编辑Nnew问题:

[语义错误]第0行,第79行'auteur =:autor':错误:无效的PathExpression。期望StateFieldPathExpression或SingleValuedAssociationField。

500内部服务器错误 - QueryException 1个链接异常: QueryException»

[2/2] QueryException:[语义错误]第0行,第79行'auteur =:autor':错误:无效的PathExpression。期望StateFieldPathExpression或SingleValuedAssociationField。

[1/2] QueryException:SELECT o,FROM SB \ MainBundle \ Entity \ Ouvrages o INNER JOIN o.auteur a WHERE o.auteur =:autor AND o.isSell = true ORDER BY o.id desc

我已经使用了这个请求:

    public function getOuvragesEchangesByAutor($auteurs){
    //requete en DQL 2eme partie
    $query = $this->createQueryBuilder('o')->where('o.auteur = :autor')
                                            ->andWhere('o.isTrade = true')
                                            ->join('o.auteur','a')
                                            ->setParameter('autor',$auteurs)
                                            ->orderBy('o.id','desc')
                                            ->addSelect('a');
    return $query->getQuery()->getResult();
}

感谢您的帮助! :d

1 个答案:

答案 0 :(得分:0)

该错误表明问题可能在您的实体定义中。 ouvrages_auteurs必须像Ouvrages实体中的关联属性一样存在,但更简单的是将其称为auteurs,如下所示:

 // Ouvrage Entity definitions...

 /**
 * @ORM\ManyToMany(targetEntity="Auteurs", inversedBy="ouvrages")
 * @ORM\JoinTable(name="ouvrages_auteurs",
 *      joinColumns={@ORM\JoinColumn(name="ouvrage_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="auteur_id", referencedColumnName="id")}
 *      )
 */
private $auteurs;

/*
 * Constructor
 */
public function __construct()
{
    $this->auteurs =  new \Doctrine\Common\Collections\ArrayCollection();
}

稍后在您的查询中,您应该创建类似这样的dql JOIN子句:

SELECT o, a
FROM SBMainBundle:Ouvrages o 
JOIN o.auteurs a 
WHERE o.is_trade = true  

所有与选定auteurs相关的ouvrages将在结果中返回,子句:o.id = oa.ouvrages_id不是必需的。

有关Doctrine mapping的更多信息:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional

编辑新问题:

我认为问题是如果autors信息在auteurs中,那么:

$query = $this->createQueryBuilder('o')->where('a.id = :autor')
                                        ->andWhere('o.isTrade = true')
                                        ->join('o.auteur','a')
                                        ->setParameter('autor',$auteurs)
                                        ->orderBy('o.id','desc')
                                        ->addSelect('a');