如何检查日期(年/月/日)是否已提交?

时间:2017-09-20 07:04:07

标签: sql symfony filter

我有一个过滤条,您可以使用名称和车辆品牌进行搜索,但我想知道如何以此格式实际检查日期 - > 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)时,当我没有输入日期时它会显示为false,并显示我的日期。所以我想这确实有效。 我仍然存在的问题是它没有显示任何结果,只是一个结果为零的空白页。

我不知道你是否需要我的控制器或我的树枝来获得更好的画面?我没有把它们放在这里,因为我觉得这没有必要,但随便问我。

2 个答案:

答案 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;
}

有意义吗?

答案 1 :(得分:0)

好的,我成功地完成了这项工作。这是代码。

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

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

        $fullDate = \DateTime::createFromFormat( "d/m/Y", $filter);


        $or = new Orx();

        if($fullDate !== false) {
            $fullDate = $fullDate->format('Y-m-d');
            $textFilters[] = $qb->expr()->orx($qb->expr()->like('opn.dateCreation', ':date'));
        }

        $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)
            ->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");

        if ($fullDate) {
            $qb->setParameter('date','%'. $fullDate .'%');
        }

        return $qb->getQuery();
    }

希望在相同的情况下帮助一些人