使用Doctrine过滤相关表上的行

时间:2016-08-03 12:32:25

标签: php doctrine symfony

我对Doctrine / Symfony很新,我拉我的头发因为我无法做到这一点。

我有一个外键相关的两个表。

Product: id, name, stock
Order: id, date, productId, quantity, sent

我可以使用$produt->getOrders()获取一个产品的所有订单,但我希望那些待发送的产品。

我该怎么做?。

感谢。

2 个答案:

答案 0 :(得分:0)

如果您想要许多产品的所有订单,您可以使用QueryBuilder

$this->createQueryBuilder('order')
->join('order.productId', 'order')
->where('order.sent = :sentStatus')->setParameter('sentStatus', true)
->getQuery()
->getResult();

如果您已有产品对象/实体,并且想要为每个产品选择订单:

$this->createQueryBuilder('order')
->join('order.productId', 'order')
->where('order.sent = :sentStatus')->setParameter('sentStatus', true)
->where('product = :productEntity')->setParameter('productEntity', $productEntity)
->getQuery()
->getResult();

如果您不想使用QueryBuilder您可以循环或过滤订单集合:details

了解Lazy Loading及其impact to performance

答案 1 :(得分:0)

您可以通过两种方式完成此操作:

首先使用像这样的QueryBuilder(我建议):

class SomeServiceOrController() { 

    function getOrdersPending($productId) {

        return $this->getEntityManager()->createQueryBuilder()
            ->select('order')
            ->from('\AppBundle\Order', 'order') // or whatever your namespace your Entity is
            ->join('order.productId', 'product')
            ->where('order.productId =: productParam')
            ->andWhere('order.sent = :sentParam')
            ->setParameter('productParam', $productId)
            ->setParameter('sentParam', 'pending')
            ->getQuery()
            ->getResult;
    }
}

参见参考here

其次是DQL(Doctrine查询语言)。有关用法,请参阅this参考。它与使用你的php命名空间的SQL非常相似。