2017-09-20 81 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