[英]How to use BETWEEN in symfony2?
我正在使用symfony2進行項目。 我有一個date_started和date_ended,我打算使用BETWEEN而不是> =和<=。 我只想問一下如何使用symfony2實現它的任何想法? 由於我的工作無效。 這是我的示例代碼:
倉庫:
public function getAllTransaction($rNumber,$gNumber,$senderId,$receiverId,$docType,$direction,$startDate,$endDate,$page = 1, $limit = 10) {
$em = $this->getEntityManager();
$query = $em->createQuery(
'SELECT partial a.{supplierTransactionDetailId, rNumber, pNumber, invNumber, anNumber, adNumber, amount},
partial b.{supplierTransactionId, transactionDate, senderId, receiverId, isaNumber, gsNumber, fileName},
partial c.{supplierDocTypeId, docType, direction}
FROM SupplierBundle:SupplierTransactionDetail a
JOIN a.supplierTransaction b
JOIN b.supplierDocType c
WHERE (a.rNumber LIKE :rNumber OR a.pNumber LIKE :rNumber
OR a.invNumber LIKE :rNumber
OR a.anNumber LIKE :rNumber
OR a.adNumber LIKE :rNumber )
AND b.gsNumber LIKE :gsNumber
AND b.senderId LIKE :senderId
AND b.receiverId LIKE :receiverId
AND c.docType LIKE :docType
AND c.direction LIKE :direction
AND b.transactionDate BETWEEN :startDate AND :endDate
ORDER BY b.transactionDate desc'
)
->setParameter('rNumber', "%$rNumber%")
->setParameter('gsNumber', "%$gsNumber%")
->setParameter('senderId', "%$senderId%")
->setParameter('receiverId' , "%$receiverId%")
->setParameter('docType',"%$docType%")
->setParameter('direction', "%$direction%")
->setParameter('startDate', "%$startDate%")
->setParameter('endDate', "%$endDate%")
->setFirstResult(($page - 1) *$limit )
->setMaxResults($limit);
$paginator = new Paginator ($query, $fetchJoinCollection = false );
$paginator->setUseOutputWalkers(false);
return $paginator;
}
這段代碼通過分頁顯示所有事務,並且還可以搜索,但是當我放置最后一部分時, transactionDate with Between it doesn't display nothing.
的transactionDate with Between it doesn't display nothing.
。
控制器:
public function trackAction(Request $request,$page){
$rNumber = $request->query->get('rNumber');
$gsNumber = $request->query->get('gsNumber');
$senderId = $request->query->get('senderId');
$receiverId = $request->query->get('receiverId');
$docType = $request->query->get('docType');
$direction = $request->query->get('direction');
$startDate = $request->query->get('startDate');
$endDate = $request->query->get('endDate');
$max_records = 10;
$em = $this->getDoctrine()->getManager();
$trans = $em->getRepository('SupplierBundle:SupplierTransactionDetail')->getAllTransaction($rNumber,$gsNumber,$senderId,$receiverId,$docType,$direction,$startDate,$endDate,$page , 10);
$count = $trans->count();
$pagination = array(
'page' => $page,
'route' => 'supplier_tracking',
'route_params' => array()
);
if ($max_records > 0 ){
$pagination['pages_count'] = max(ceil($count / $max_records), 1);
}
return $this->render('SupplierBundle:Supplier:tracking.html.twig',array('trans' => $trans, 'pagination' => $pagination));
}
更新
在我的數據庫中transactionDate的格式如下:
2015-05-18 18:10:00因為它是日期時間。 以我的形式,,,startdate和enddate是日期的輸入類型。
現在,您已經按照@EdCottrell的答案刪除了BETWEEN語法的LIKE。 我認為您還需要更改這兩行以刪除LIKE語法中使用的%
。
->setParameter('startDate', "$startDate")
->setParameter('endDate', "$endDate")
還做你真正需要的一切LIKE
“d這樣的。 一切似乎有些毛躁。 由於大多數這些字段似乎都是數字,所以我懷疑實際上是否需要LIKE語法,盡管我只是猜測它們是來自其名稱的數字。
重新發表您對數字的評論
然后嘗試執行此操作,刪除所有喜歡的內容,並將值作為數字而不是字符串傳遞。
public function getAllTransaction(
$rNumber,$gNumber,$senderId,$receiverId,
$docType,$direction,$startDate,$endDate,
$page = 1, $limit = 10
)
{
$em = $this->getEntityManager();
$query = $em->createQuery(
'SELECT partial a.{supplierTransactionDetailId, rNumber, pNumber, invNumber, anNumber, adNumber, amount},
partial b.{supplierTransactionId, transactionDate, senderId, receiverId, isaNumber, gsNumber, fileName},
partial c.{supplierDocTypeId, docType, direction}
FROM SupplierBundle:SupplierTransactionDetail a
JOIN a.supplierTransaction b
JOIN b.supplierDocType c
WHERE ( a.rNumber = :rNumber
OR a.pNumber = :rNumber
OR a.invNumber = :rNumber
OR a.anNumber = :rNumber
OR a.adNumber = :rNumber )
AND b.gsNumber = :gsNumber
AND b.senderId = :senderId
AND b.receiverId = :receiverId
AND c.docType = :docType
AND c.direction = :direction
AND b.transactionDate BETWEEN :startDate AND :endDate
ORDER BY b.transactionDate desc'
)
->setParameter('rNumber', $rNumber)
->setParameter('gsNumber', $gsNumber)
->setParameter('senderId', $senderId)
->setParameter('receiverId' , $receiverId)
->setParameter('docType', $docType)
->setParameter('direction', $direction)
->setParameter('startDate', $startDate)
->setParameter('endDate', $endDate)
->setFirstResult(($page - 1) *$limit )
->setMaxResults($limit);
// add this debug code to check the generated query
// you could try and run this using phpMyadmin or
// whatever mysql tools you use. If taht gets errors
// come back here an mod the generator
echo $query->getSQL();
$paginator = new Paginator ($query, $fetchJoinCollection = false );
$paginator->setUseOutputWalkers(false);
return $paginator;
}
RE:我發現了
這是echo $query->getSQL();
的結果echo $query->getSQL();
是QueryBuilder從所有輸入生成的查詢。
我會將其復制/粘貼到類似phpMyAdmin的文件中,或者將其粘貼到用於查看mysql數據庫的任何工具中,替換?
使用您正在使用的實際參數並嘗試運行它。
我的猜測是,因為它是如此復雜,所以您創建了一個不可能的要求,它要么在編譯階段失敗,要么僅不返回任何結果。 然后,您可以處理查詢,直到正確為止,然后相應地更改PHP腳本。
SELECT e0_.supplier_transaction_detail_id AS supplier_transaction_detail_id0,
e0_.r_number AS r_number1,
e0_.p_number AS p_number2,
e0_.inv_number AS inv_number3,
e0_.an_number AS an_number4,
e0_.ad_number AS ad_number5,
e1_.supplier_transaction_id AS supplier_transaction_id7,
e1_.sender_id AS sender_id8,
e1_.receiver_id AS receiver_id9,
e1_.transaction_date AS transaction_date11,
e1_.gs_number AS gs_number12,
e2_.supplier_doc_type_id AS supplier_doc_type_id14,
e2_.doc_type AS doc_type15,
e2_.direction AS direction16,
e0_.supplier_transaction_id AS supplier_transaction_id17,
e1_.supplier_doc_type_id AS supplier_doc_type_id18
FROM supplier_transaction_detail e0_
INNER JOIN supplier_transaction e1_ ON e0_.supplier_transaction_id = e1_.supplier_transaction_id
INNER JOIN supplier_doc_type e2_ ON e1_.supplier_doc_type_id = e2_.supplier_doc_type_id
WHERE (e0_.r_number = ? OR
e0_.p_number = ? OR
e0_.inv_number = ? OR
e0_.an_number = ? OR
e0_.ad_number = ?)
AND e1_.gs_number = ?
AND e1_.sender_id = ?
AND e1_.receiver_id = ?
AND e2_.doc_type = ?
AND e2_.direction = ?
OR e1_.transaction_date BETWEEN ? AND ?
ORDER BY e1_.transaction_date DESC LIMIT 10 OFFSET 0
您不要在BETWEEN
子句中使用LIKE
; 只是BETWEEN x AND y
:
SELECT a,b,c
FROM SupplierBundle:SupplierTransactionDetail a
JOIN a.supplierTransaction b
JOIN b.supplierDocType c
WHERE b.transactionDate
BETWEEN :startDate AND :endDate
ORDER BY b.transactionDate desc
嘿,要設置正確的查詢,它必須看起來像這樣:
SELECT ..
FROM ..
WHERE (SELECT .. FROM ..) BETWEEN .. AND ..
我根據您的代碼為您設置了示例。 記住要添加更多查詢。 因此,此查詢和子查詢的示例應類似於以下內容:
$subQueryDQL = $qbv->select('a.parameter')
->from('SupplierBundle:SupplierTransactionDetail', 'a')
...
->getDQL();
$qb->andWhere($qb->expr()->between(
sprintf('(%s)', $subQueryDQL),
$filter->getStartDate()->getTimestamp(),
$filter->getEndDate()->getTimestamp()
));
您的代碼如下所示:$ em = $ this-> getEntityManager(); $ qb = $ em-> createQueryBuilder();
$query = $qb->select('a.supplierTransactionDetailId, a.rNumber, a.pNumber, a.invNumber, a.anNumber, a.adNumber, a.amount,
b.supplierTransactionId, b.transactionDate, b.senderId, b.receiverId, b.isaNumber, b.gsNumber, b.fileName,
c.supplierDocTypeId, c.docType, c.direction}')
->from("SupplierBundle:SupplierTransactionDetail", 'a')
->innerJoin('a.supplierTransaction', 'b')
->innerJoin('b.supplierDocType', 'c')
->add('where', $qb->expr()->between(
'b.transactionDate',
':startDate',
':endDate'
)
)
->andWhere(
$qb->expr()->like('b.senderId', ':senderId')
)
->setParameter('rNumber', "%$rNumber%")
->setParameter('gsNumber', "%$gsNumber%")
->setParameter('senderId', "%$senderId%")
->setParameter('receiverId', "%$receiverId%")
->setParameter('docType', "%$docType%")
->setParameter('direction', "%$direction%")
->setParameter('startDate', "%$startDate%")
->setParameter('endDate', "%$endDate%")
->setFirstResult(($page - 1) * $limit)
->setMaxResults($limit);
$paginator = new Paginator ($query, $fetchJoinCollection = false);
$paginator->setUseOutputWalkers(false);
return $paginator;
您將不得不自己在其他位置添加更多內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.