我正在尝试将此SQL查询构建到查询构建器中,但是在添加联接时会中断。如果我退出加入,则可以使用它,但是在加入中有该项目的ID可以访问。
我尝试了使用查询生成器的其他方法,已经阅读了文档并按照其说明进行操作,但不起作用。
这是我的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
id想要做的是选择“发票”表库以及“项目”表,以便我可以访问其两个属性。我正在尝试创建一个运行SQL查询的Symfony命令,报告状态2中项目的结果,并最终将其添加为cronjob。
答案 0 :(得分:0)
您可以显示实体中关联的代码吗?从您的问题来看,应该像这样
/** @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;
// ...
}
答案 1 :(得分:0)
在您的QueryBuilder代码中没有看到联接,您只是在这里忘记了联接还是那是错误?我在下面的情况下编写了一个函数,但是遵循这些原则可以为您提供帮助。我在您的普通sql中没有看到连接条件,因此我假设列名相同。如果查询正常但错误仍然存在,请查看您实体中的注释,您可能需要类似
在您的实体中。 (就像@Azhar Khattak所说的那样)
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();
}