如何使用 table 数据库不是实体来发出 dql 请求
how to make a dql request with table database are not an entity
我想了解为什么我的 DQL 请求不起作用。我必须实体:书籍(ouvrages)和作者(auteurs),存在多对多关系,所以在我的数据库中,一个连接 table 是 create books_authors (ouvrages_auteurs) with reference "id" 彼此。我想使用此联接 table 获取我的两本实体书籍和作者的所有信息。
我在我的 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 行,'ouvrages_auteurs' 附近的第 45 列:错误:Class 'ouvrages_auteurs' 未定义。
500 内部服务器错误 - QueryException
1 个链接异常:
查询异常 »
[2/2] QueryException:[语义错误] 第 0 行,'ouvrages_auteurs' 附近的第 45 列:错误:Class 'ouvrages_auteurs' 未定义。
[1/2] QueryException: 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
为第 N 期编辑:
[语义错误] 第 0 行,'auteur = :autor' 附近的第 79 列:错误:无效的 PathExpression。应为 StateFieldPathExpression 或 SingleValuedAssociationField。
500 内部服务器错误 - QueryException
1 个链接异常:
查询异常 »
[2/2] QueryException:[语义错误] 第 0 行,'auteur = :autor' 附近的第 79 列:错误:无效的 PathExpression。应为 StateFieldPathExpression 或 SingleValuedAssociationField。
[1/2] QueryException: SELECT o, a 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
该错误表明问题可能出在您的实体定义中。 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
所有与所选 ouvrages
相关的 auteurs
将在结果中返回,子句:o.id = oa.ouvrages_id
不是必需的。
更多关于 Doctrine 映射的信息:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional
编辑新问题:
我认为问题在于,如果汽车信息在 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');
我想了解为什么我的 DQL 请求不起作用。我必须实体:书籍(ouvrages)和作者(auteurs),存在多对多关系,所以在我的数据库中,一个连接 table 是 create books_authors (ouvrages_auteurs) with reference "id" 彼此。我想使用此联接 table 获取我的两本实体书籍和作者的所有信息。
我在我的 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 行,'ouvrages_auteurs' 附近的第 45 列:错误:Class 'ouvrages_auteurs' 未定义。
500 内部服务器错误 - QueryException 1 个链接异常: 查询异常 »
[2/2] QueryException:[语义错误] 第 0 行,'ouvrages_auteurs' 附近的第 45 列:错误:Class 'ouvrages_auteurs' 未定义。
[1/2] QueryException: 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
为第 N 期编辑:
[语义错误] 第 0 行,'auteur = :autor' 附近的第 79 列:错误:无效的 PathExpression。应为 StateFieldPathExpression 或 SingleValuedAssociationField。
500 内部服务器错误 - QueryException 1 个链接异常: 查询异常 »
[2/2] QueryException:[语义错误] 第 0 行,'auteur = :autor' 附近的第 79 列:错误:无效的 PathExpression。应为 StateFieldPathExpression 或 SingleValuedAssociationField。
[1/2] QueryException: SELECT o, a 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
该错误表明问题可能出在您的实体定义中。 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
所有与所选 ouvrages
相关的 auteurs
将在结果中返回,子句:o.id = oa.ouvrages_id
不是必需的。
更多关于 Doctrine 映射的信息:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional
编辑新问题:
我认为问题在于,如果汽车信息在 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');