首页 > 解决方案 > Symfony 连接表

问题描述

我对Symfony完全陌生,我正在努力使用查询构建器。

我在多对多关系中有卡实体和交易实体。

card entity: (id, card_number, code)
transaction entity: (id, amount, source, destination)
card_transaction: (card_id, transaction_id)

我想获取具有给定卡号的所有交易。

标签: symfony

解决方案


我们通常需要查看这两个实体类的来源。

您是否为CardTransaction实体创建了存储库类?您可以创建它以获得可重用的查询,如下所示:

<?php

namespace App\Repository;

class CardTransactionRepository extends \Doctrine\ORM\EntityRepository
{
    public function findByCardNumber(int $cardNumber): array
    {
        if ($cardNumber < 1) {
            throw new \InvalidArgumentException("Card ID invalid.");
        }

        $qb = $this->createQueryBuilder("ct")
            ->leftJoin("ct.card", "c")
            ->andWhere("c.cardNumber = :cardNumber")
            ->setParameter("cardNumber", $cardNumber)
        ;

        return $qb->getQuery()->getResult();
    }
}

话虽这么说,您正在做的是一个如此简单的查询/操作,您不需要查询构建器来完成它。这正是实体类变得容易的地方,包括 Doctrine 的ArrayCollection类。

如果您只是在控制器或视图中执行此操作并且已经加载了Card实体,则您不需要在存储库类中进行查询。假设$card->getCardTransactions()您已经在Card. - 再说一次,没有看到CardCardTransaction实体源,我无法准确地告诉你你有(或需要)什么方法名称。

您可以通过控制器中的属性检索Card实体,card_number如下所示:

$card = $this->getRepository(Card::class)->findOneByCardNumber($cardNumber);

理想情况下,您应该检查它是否存在,虽然有点像这样:

if (!($cardNumber = intval($cardNumber))) { // Do something better to validate the card number that has been specified, e.g. a `preg_match()`
    throw $this->createNotFoundException("Card not specified.");
}

if (!($card = $this->getRepository(Card::class)->findOneByCardNumber($cardNumber))) {
    throw $this->createNotFoundException("Card not found.");
}

推荐阅读