symfony2中的经典查询

本文介绍了Symfony2中DQL的使用方法,包括连表查询、分页查询、WHERE IN子句的应用及时间条件处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.这是symfony2中的连表查询
$sql = 'SELECT g
        FROM AppBundle:Goods g,
             AppBundle:GoodsRelated gr
        Where g.id = gr.relatedGoodsId
        AND g.status  = :status
        AND gr.goodsId = :goodsId
        ORDER BY g.onShelfTime DESC';

$params['status'] = Goods::STATUS_ON_SHELF;
$params['goodsId'] = $goodsId;
$query = $this->entityManager->createQuery($sql);
$resultList = $query->setParameters($params)->setMaxResults($maxNumber)->getResult();

执行sql语句
SELECT c0_.id AS id_0 FROM cs_goods c0_, cs_goods_related c1_ WHERE c0_.id = c1_.related_goods_id AND c0_.status = 1 AND c1_.goods_id = '00ec49a3-a652-11e5-97ab-ac162d8b0550' ORDER BY c0_.on_shelf_time DESC LIMIT 10;
2.带分页的dql写法
public function getList($page, $pageSize, $targetUser, $startDate, $endDate)
{
    if (empty($endDate)) {
        $endDate = $startDate;
    }
    $startTimestamp = strtotime($startDate);
    $endTimestamp = strtotime($endDate);

    if ($startTimestamp > $endTimestamp) {
        throw new \Exception("参数不正确", BaseException::ERROR_CODE_ILLEGAL_PARAMETER);
    }

    $warehouseId = $targetUser->getWarehouseId();
    $sql = 'SELECT i FROM AppBundle:InventoryOrder i WHERE';
    $sql .= ' i.warehouseId = :warehouseId';
    if ($startTimestamp) {
        $start = date('Y-m-d 00:00:00', $startTimestamp);
        $end = date('Y-m-d 23:59:59', $endTimestamp);
        $index = ' AND i.submitTime';
        $sql .= $index;
        $sql .= ' BETWEEN :startDate AND :endDate ';
        $params['endDate'] = $end;
        $params['startDate'] = $start;
    }
    $params['warehouseId'] = $warehouseId;
    $sql .= ' ORDER By i.submitTime DESC, i.createTime DESC';

    $query = $this->entityManager->createQuery($sql);
    $offset = $pageSize * ($page - 1);

    $orderList = $query->setParameters($params)->setFirstResult($offset)->setMaxResults($pageSize)->getResult();
    $data = array();
    if (!empty($orderList)) {
        foreach ($orderList as $order) {
            $operatorIds[] = $order->getOperatorId();
        }
        foreach ($orderList as $order) {
            $data[] = InventoryOrderDTOBuilder::build($order);
        }
    }

    return $data;
}

3.这是where in的写法,也是使用queryBuilder的写法
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$resultList = $queryBuilder->select('s')
    ->from('AppBundle:StockHistory', 's')
    ->Where('s.materialId = :materialId')
    ->andWhere($queryBuilder->expr()->in('s.action', $actionList))
    ->orderBy('s.createTime', 'DESC')
    ->setParameter('materialId', $materialId)
    ->getQuery()->getResult();

return $resultList;

4.这是常用的查询:对于时间,是可选的时候,处理方式
private function _validateTime($startDate, $endDate)
{
    if (empty($startDate) && empty($endDate)) {
        return;
    }

    if (empty($startDate) && !empty($endDate) ) {
        throw new \Exception("参数不正确", BaseException::ERROR_CODE_ILLEGAL_PARAMETER);
    }
    if (!empty($startDate) && empty($endDate)) {
        $endDate = $startDate;
    }

    $startTimestamp = strtotime($startDate)?strtotime($startDate):false;
    $endTimestamp = strtotime($endDate)?strtotime($endDate):false;

    if ($startTimestamp === false) {
        throw new \Exception("日期格式非法", BaseException::ERROR_CODE_ILLEGAL_PARAMETER);
    } else {
        $start = date('Y-m-d 00:00:00', $startTimestamp);
    }

    if($startTimestamp === false){
        throw new \Exception("日期格式非法", BaseException::ERROR_CODE_ILLEGAL_PARAMETER);
    } else {
        $end = date('Y-m-d 23:59:59', $endTimestamp);
    }

    return array('start' => $start, 'end' => $end);
}

这是一个经典的查询 queryBuilder的写法
private function _getOrderList($targetUser, $page, $pageSize, $startDate, $endDate, $status, $paymentId, $settlementId, $order, $orderBy)
{
    // 验证支付方式
    $this->_validatePayment($paymentId);
    // 验证结算类型
    $this->_validateSettlement($settlementId);
    // 验证时间并获取时间
    $timeRange = $this->_validateTime($startDate, $endDate);
    $query = $this->entityManager->getRepository('AppBundle:SalesOrder')->createQueryBuilder('p');

    if (!empty($status) && in_array($status, array(SalesOrder::UNCHECK_ORDER, SalesOrder::NOT_SEND_ORDER, SalesOrder::SENT_ORDER, SalesOrder::STATUS_SUBMITTED))) {
        $query->where('p.status = :status')
            ->setParameter('status', "$status");
    }
    if (!empty($status) && !in_array($status, array(SalesOrder::UNCHECK_ORDER, SalesOrder::NOT_SEND_ORDER, SalesOrder::SENT_ORDER, SalesOrder::STATUS_SUBMITTED))) {
        throw new \Exception("参数不正确", BaseException::ERROR_CODE_ILLEGAL_PARAMETER);
    }
    $orderBy = $this->_confirmOrderBy($status, $orderBy);

    $warehouseId = $targetUser->getWarehouseId();
    $query->andWhere('p.warehouseId = :warehouseId')
          ->setParameter('warehouseId', "$warehouseId")
          ->orderBy($orderBy, $order)
          ->setFirstResult($pageSize * ($page-1))
          ->setMaxResults($pageSize);  //相当于limit  取多少条数据 setLimit(100);*/

   if (!empty($timeRange)) {
        $start = $timeRange['start'];
        $end = $timeRange['end'];
        $query->andWhere("{$orderBy} >= :start")
              ->setParameter('start', "$start")
              ->andWhere("{$orderBy} <= :end")
              ->setParameter('end', "$end");
    }

    if (!empty($paymentId)) {
        $query->andWhere('p.paymentId = :paymentId')
            ->setParameter('paymentId', "$paymentId");
    }
    if (!empty($settlementId)) {
        $query->andWhere('p.settlementId = :settlementId')
            ->setParameter('settlementId', "$settlementId");
    }
    $resultList = $query->getQuery()->getResult();

    return $resultList;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值