Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在symfony2中使用BETWEEN?_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 如何在symfony2中使用BETWEEN?

Php 如何在symfony2中使用BETWEEN?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在使用symfony2进行一个项目。我有一个开始日期和结束日期,我计划使用BETWEEN而不是>=和在BETWEEN子句中使用之类的;就在x和y之间: SELECT a,b,c FROM SupplierBundle:SupplierTransactionDetail a JOIN a.supplierTransaction b JOIN b.supplierDocType c WHERE b.transactionDate BETWEEN :startDate

我正在使用symfony2进行一个项目。我有一个开始日期和结束日期,我计划使用BETWEEN而不是>=和在
BETWEEN
子句中使用
之类的
;就在x和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

BETWEEN
子句中不能使用
LIKE
;就在x和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

BETWEEN
子句中不能使用
LIKE
;就在x和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

BETWEEN
子句中不能使用
LIKE
;就在x和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

现在,您已经删除了BETWEEN语法的LIKE,如@EdCottrell answer所示。我认为您还需要更改这两行,以删除LIKE语法中使用的
%

->setParameter('startDate', "$startDate")
->setParameter('endDate', "$endDate")
你真的需要像这样的东西吗?我喜欢。这一切似乎有点毛茸茸的。由于这些字段中的大多数似乎是数字,我怀疑是否需要类似的语法,尽管我只是猜测它们是来自其名称的数字

请回复您对数字的评论

然后尝试这个方法,删除所有的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()的结果和是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,如@EdCottrell answer所示。我认为您还需要更改这两行,以删除LIKE语法中使用的
%

->setParameter('startDate', "$startDate")
->setParameter('endDate', "$endDate")
你真的需要像这样的东西吗?我喜欢。这一切似乎有点毛茸茸的。由于这些字段中的大多数似乎是数字,我怀疑是否需要类似的语法,尽管我只是猜测它们是来自其名称的数字

请回复您对数字的评论

然后尝试这个方法,删除所有的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()的结果和是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,如@EdCottrell answer所示。我认为您还需要更改这两行,以删除LIKE语法中使用的
%

->setParameter('startDate', "$startDate")
->setParameter('endDate', "$endDate")
你真的需要像这样的东西吗?我喜欢。这一切似乎有点毛茸茸的。由于这些字段中的大多数似乎是数字,我怀疑是否需要类似的语法,尽管我只是猜测它们是来自其名称的数字

请回复您对数字的评论

然后尝试这个方法,删除所有的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()的结果和是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,如@EdCottrell answer所示。我认为您还需要更改这两行,以删除LIKE语法中使用的
%

->setParameter('startDate', "$startDate")
->setParameter('endDate', "$endDate")
你真的需要像这样的东西吗?我喜欢。这一切似乎有点毛茸茸的。由于这些字段中的大多数似乎是数字,我怀疑是否需要类似的语法,尽管我只是猜测它们是来自其名称的数字

请回复您对数字的评论

然后尝试这个方法,删除所有的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()的结果和是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

嘿,要设置正确的查询,必须如下所示:

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()
));
你的代码看起来很糟糕