Как добавить правильного построителя Doctrine Query и присоединиться к таблице - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь встроить этот SQL-запрос в построитель запросов, но при добавлении объединения оно прерывается.Если я снимаю «Присоединиться», это работает, но в «Присоединении» есть элементы, к которым хотелось бы иметь доступ.

Я пробовал разные способы использования построителя запросов, я прочитал документацию и следую его инструкциям, но она не работает.

Вот мой SQL-запрос

SELECT * FROM invoice i
      JOIN item it

WHERE  i.created_at >= '2019-03-26 08:00:00' and
i.created_at <= '2019-03-26 08:05:00' and i.status=2;

Вот мой конструктор запросов внутри Symfony.

       /** @var \Doctrine\ORM\EntityManager $em *
    $em = $container->get('doctrine')->getManager();

    $em->getConnection()->getConfiguration()->setSQLLogger(null);

      /** @var EntityRepository $repository */
    $repository = $em->getRepository('GivingBundle:Invoice');

      /** @var QueryBuilder $qb */
     $qb = $repository->createQueryBuilder('i');
    $qb->join('i.item', 'it')
         ->Where($qb->expr()->between('i.created_at', ':starts_at', ':ends_at'))->andWhere('i.status = 1')

        ->setParameter('starts_at',$startsAt,\Doctrine\DBAL\Types\Type::DATETIME)
        ->setParameter('ends_at', $endsAt,\Doctrine\DBAL\Types\Type::DATETIME)
    ;

    $query = $qb->getQuery();
    $results = $query->getResult();

Однако я получаю сообщение об ошибке (ниже)

Doctrine\ORM\Query\QueryException]                                                                                                          
  [Semantical Error] line 0, col 66 near 'it WHERE (i.created_at': 
 Error: Class KCM\GivingBundle\Entity\Invoice has no association 
named item  

То, что я хотел бы сделать, это выбрать базу данных таблицы счетов-фактур вместе с таблицей товаров, чтобы я мог получить доступ к обоим ее свойствам.Я пытаюсь создать команду Symfony, которая запускает SQL-запрос, сообщает о результатах для элементов со статусом 2 и, в конце концов, добавляет ее в виде cronjob.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я не видел объединения в вашем коде QueryBuilder, вы просто забыли его здесь или это ошибка?Ниже я написал функцию, которая будет работать в моем случае, но кое-что из этого должно помочь вам.Я не видел условия соединения в вашем простом sql, поэтому я предположил, что имена столбцов совпадают.Если запрос работает, но ошибка состоит в том, что посмотрите на аннотации в вашей сущности, вам, вероятно, понадобится что-то вроде

  • @ ORM \ ManyToOne (targetEntity = "Invoice") *
  • @ ORM \ JoinColumn (name = "invoice_id", referencedColumnName = "id")

в ваших сущностях.(Как уже сказал @Ажар Хаттак)

public function findInvoice($dateFrom, $dateTo)
    {
        $qb = $this->em->createQueryBuilder();
        $qb->select('i')
            ->from(Invoice::class, 'i')
            ->join(Item::class, 'it', Join::WITH, 'i.created_at = it.created_at')
            ->where($queryBuilder->expr()->between('r.created_at', ':datefrom', ':dateto'))
            ->andWhere($qb->expr()->eq('i.status', 1))
            ->setParameters(['datefrom' => $dateFrom, 'dateto' => $dateTo])
        return $qb->getQuery()->getResult();
    }
0 голосов
/ 27 марта 2019

Можете ли вы показать код для ассоциаций в вашей организации? По вашему вопросу это выглядит так, это должно быть что-то вроде

/** @Entity */
class Invoice
{
    // ...
    /**
     * This is the inverse side.
     * @OneToMany(targetEntity="Items", mappedBy="invoice")
     */
    private $items;
    // ...

    public function __construct() {
        $this->items= new ArrayCollection();
    }
}

/** @Entity */
class Items
{
    // ...
    /**
     * This is the owning side.
     * @ManyToOne(targetEntity="Invoice", inversedBy="items")
     * @JoinColumn(name="invoice_id", referencedColumnName="id")
     */
    private $invoice;
    // ...
}

Подробнее об ассоциациях: https://www.doctrine -project.org / projects / doctrine-orm / ru / 2.6 / reference / association-mapping.html # один-ко-многим-двунаправленным

...