【问题标题】:Doctrine Join with composite keysDoctrine Join 与复合键
【发布时间】:2020-05-15 10:14:34
【问题描述】:

主要实体Conferimenti.php

/**
 * Conferimenti
 *
 * @ORM\Table(name="conferimenti")
 * @ORM\Entity(repositoryClass="App\Repository\ConferimentiRepository")
 */
class Conferimenti
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="conferimenti_id_seq", allocationSize=1, initialValue=1)
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Infocomune")
     * @ORM\JoinColumn(name="idcomune", referencedColumnName="id")
     */
    private $idcomune;

    /**
     * @ORM\ManyToOne(targetEntity="Inforifiuti")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="tiporifiuto", referencedColumnName="codicerifiuto"),
     *   @ORM\JoinColumn(name="idcomune", referencedColumnName="idcomune")
     * })
     */

    private $tiporifiuto;

信息.php

/**
 * Inforifiuti
 *
 * @ORM\Table(name="inforifiuti")
 * @ORM\Entity
 */
class Inforifiuti
{
    /**
     * @var int
     *
     * @ORM\Column(name="codicerifiuto", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $codicerifiuto;

    /**
     * @var int
     *
     * @ORM\Column(name="idcomune", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $idcomune;

    /**
     * @var string
     *
     * @ORM\Column(name="descrizione", type="string", length=80, nullable=false)
     */
    private $descrizione;

Infocomune.php

/**
 * Infocomune
 *
 * @ORM\Table(name="infocomune")
 * @ORM\Entity
 */
class Infocomune
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="infocomune_id_seq", allocationSize=1, initialValue=1)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nome", type="string", length=80, nullable=false)
     */
    private $nome;

我正在尝试执行此查询(在 Postgres 上工作),但无法使其与学说 ORM 一起工作:(

SELECT r.descrizione, SUM(c.peso) as totale
INNER JOIN inforifiuti AS r ON r.codicerifiuto = c.tiporifiuto AND r.idcomune = c.idcomune
WHERE c.idcomune = :id_comune AND c.dataora >= '2019-01-01' AND c.dataora <= '2019-10-30'
GROUP BY c.tiporifiuto, r.descrizione

查询生成器

$query = $qb
    ->select(array('r.descrizione','SUM(c.peso) as totale'))
    ->innerJoin('c.tiporifiuto','r', Expr\Join::WITH, $qb->expr()->andX(
        $qb->expr()->eq('c.tiporifiuto', 'r.codicerifiuto'),
        $qb->expr()->eq('c.idcomune', 'r.idcomune')
    ))
    ->where('c.idcomune = :id_comune')
    ->andWhere($qb->expr()->between('c.dataora', ':date_from', ':date_to'))
    ->setParameter('id_comune', $id_comune)
    ->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME)
    ->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME)
    ->groupBy('c.tiporifiuto')
    ->addGroupBy('r.descrizione')
    ->getQuery();

我收到此错误

不支持到具有复合主键的实体的单值关联路径表达式。在查询中显式命名复合主键的组件。

试图替换 ->GroupBy 但同样的错误

->add('groupBy', new Expr\GroupBy(['c.tiporifiuto', 'r.descrizione']))

更新 尝试使用直接 DQL 但同样的错误

$query = $this->getEntityManager()->createQuery(
    'SELECT r.descrizione, SUM(c.peso) as totale
     FROM App\Entity\conferimenti AS c
     INNER JOIN App\Entity\inforifiuti AS r
     WHERE c.idcomune = :id_comune AND c.dataora >= :date_from AND c.dataora <= :date_to
     GROUP BY c.tiporifiuto, r.descrizione')
    ->setParameter('id_comune', $id_comune)
    ->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME)
    ->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME);

不支持到具有复合主键的实体的单值关联路径表达式。在查询中显式命名复合主键的组件。

【问题讨论】:

    标签: postgresql symfony doctrine-orm


    【解决方案1】:

    试试这个: $this->manager->createQuery('SELECT .........');

    喜欢这个例子:

    $query = $entityManager->createQuery(
        'SELECT p
        FROM AppBundle:Product p
        WHERE p.price > :price
        ORDER BY p.price ASC'
    )->setParameter('price', 19.99);
    

    官方文档:https://symfony.com/doc/3.4/doctrine.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多