2017-09-20 43 views
3

我有一个过滤器酒吧,在那里你可以用名字搜索,并驱动车辆的品牌,但我想知道如何在这种格式的日期实际检查 - >dd/mm/yyyy如右图什么都不知道发生在我搜索的日期,我收到一个空白页没有错误,但只有零结果。如何检查日期(dd/mm/yyyy)是否已提交?

我发现,也许用这个$fullDate = DateTime::createFromFormat('d/m/Y',$filter);一个解决方案,但我有一个挣扎在那里将其添加到我的代码。

所以我将分享你我的代码和我研究

在这里你可以看到带有过滤器参数的所有查询(我搜索)查询

public function getQueryByTypeAndPro($type, User $user, $archive, $filter) 
    { 

     $fullDate = \DateTime::createFromFormat('d/m/Y', $filter); 
     $qb = $this->createQueryBuilder("opn"); 

     $or = new Orx(); 

     if($fullDate !== false) { 
      $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.dateCreation', ':filter')); 
     } else { 
      $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.id', ':filter')); 
      $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.vehiculeMarque', ':filter')); 
      $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.clientNom', ':filter')); 
      $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.clientPrenom', ':filter')); 
     } 

     $or->addMultiple($textFilters); 
     $qb->andWhere($or); 

     $query = $qb 
      ->andWhere("opn.type = :type") 
      ->andWhere("opn.resellerId = :reseller") 
      ->andWhere("opn.archive = :archive") 
      ->setParameters([ 
       "type" => $type, 
       "reseller" => $user->getId(), 
       'archive' => $archive, 
       'filter' => '%' . $filter . '%' 
      ]) 
      ->orderBy("opn.dateCreation", "DESC") 
      ->getQuery() 
     ; 

     return $query; 
    } 

这是它显示我在我的查询分析器,当我在这个格式做一个日期搜索dd/mm/yyyy

SELECT 
    count(r0_.id) AS sclr0 
FROM 
    reseller_operation r0_ 
WHERE 
    r0_.dateCreation LIKE ? 
    AND r0_.type = ? 
    AND r0_.reseller_id = ? 
    AND r0_.archive = ? 

所以现在在这个此代码工作的方式是,当我执行转储时dump($fullDate)它显示假,当我不输入日期,并显示我的日期。所以我猜这个确实有效。 我仍然有这个问题,它不显示任何结果,只是一个空白页面,结果为零。

我不知道,如果你需要我的控制器或我的树枝,以获得更好的画面?我没有把它们放在这里,因为我认为这不是必要的,但随时可以问我。

+0

什么是你有问题?请准确地解决这个问题。 – Jeet

+0

嗨@Jeet目前我有一个过滤器栏,我可以通过名称等进行搜索(使用我的查询),但是当我输入日期格式为“**/**/****”时,它不会搜索这种格式。我想知道我该怎么做。对不起,模糊问题 –

回答

0

好吧,我成功地把这项工作。这是代码。

​​

希望帮助一些在同样的情况

0

你很好。在您的Repository中,您可以检查filter是日期时间还是字符串,并相应地设计您的查询。

createFromFormat将返回false,如果它没有从提供的字符串中获得正确的日期格式,我们可以利用它。

我从编辑你的代码,我是这么理解:

public function getQueryByTypeAndPro($type, User $user, $archive, $filter) 
{ 
    $fullDate = \DateTime::createFromFormat('d/m/Y',$filter); 


    $qb = $this->createQueryBuilder("opn"); 

    $or = new Orx(); 

    $params = [ 
     "type" => $type, 
     "reseller" => $user->getId(), 
     'archive' => $archive, 
     'filter' => '%' . $filter . '%' 
    ]; 

    // Filter date only if the filter is a valid date. 
    if ($fullDate !== false) { 
     $date = $fullDate->format('Y-m-d'); 
     $textFilters[] = $qb->expr()->andX($qb->expr()->eq('opn.dateCreation', ':date_filter')); 
     $params['date_filter'] = $date; 
    } 
    else { 
     // Filter considerting filter as a name or anything else. 
     $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.id', ':filter')); 
     $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.vehiculeMarque', ':filter')); 
     $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.clientNom', ':filter')); 
     $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.clientPrenom', ':filter')); 
    } 

    $or->addMultiple($textFilters); 
    $qb->andWhere($or); 

    $query = $qb 
     ->andWhere("opn.type = :type") 
     ->andWhere("opn.resellerId = :reseller") 
     ->andWhere("opn.archive = :archive") 
     ->setParameters($params) 
     ->orderBy("opn.dateCreation", "DESC") 
     ->getQuery() 
    ; 

    return $query; 
} 

是否有意义?

+0

非常感谢您的回答。但这实际上不起作用,因为它显示没有结果。我在symfony 2.3上,也许它是一个问题?其实我认为我可以在控制器中做到这一点。 另外,在我查询中的'use'是'use DateTime;'不知道它是否正确或者是否有帮助 –

+0

Symfony 2.3查询可能会有所不同。但是逻辑是一样的。我猜你必须用' - > like'来编辑日期条件。你不必'使用DateTime'你可以只有'核心PHP'中定义的'DateTime ::'而不是任何其他第三方库。 – Jeet

+0

我已经编辑了我的答案来处理日期过滤器的“相等”条件而不是“like”。请检查它。您需要调试任何与查询相关的错误。 – Jeet