【问题标题】:How to check if a date (dd/mm/yyyy) has been submitted?如何检查是否已提交日期(dd/mm/yyyy)?
【发布时间】:2017-12-22 00:49:24
【问题描述】:

我有一个过滤栏,您可以在其中搜索名称和车辆品牌,但我想知道如何实际检查这种格式的日期 -> 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,而在我输入时显示日期。所以我想目前确实有效。 我仍然遇到的问题是它没有显示任何结果,只是一个零结果的空白页。

我不知道您是否需要我的控制器或我的树枝才能获得更好的照片?我没有把它们放在这里,因为我认为这没有必要,但请随时问我。

【问题讨论】:

  • 您有什么问题?请准确描述问题。
  • 嗨@Jeet 目前我有一个过滤栏,我可以在其中按名称等搜索(使用我的查询)但是当我输入这样的日期格式**/**/**** 它不会以这种格式搜索.我想知道我该怎么做。很抱歉出现模糊问题

标签: sql symfony filter


【解决方案1】:

你做得很好。在您的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;
}

有意义吗?

【讨论】:

  • 非常感谢您的回答。但这实际上不起作用,因为它没有显示任何结果。我在symfony 2.3上,也许它有问题?实际上,我认为我可以在控制器中做到这一点。我的查询中的use 也是use DateTime; 不知道它是否正确或是否有帮助
  • Symfony 2.3 查询可能不同。但逻辑是一样的。我想您必须使用->like 编辑日期条件。你不必use DateTime 你可以有一个\DateTime:: 作为它在核心PHP 中定义的而不是任何其他第三方库。
  • 我已经编辑了我的答案以处理 equal 条件而不是 like 用于日期过滤器。请检查一下。您需要调试任何与查询相关的错误。
  • 我按照你的要求添加了`\DateTime,但是仍然没有结果。它刷新页面但没有显示:/我不知道什么不起作用。
  • 不知道是不是对的,看起来像吗? SELECT count(r0_.id) AS sclr0 FROM reseller_operation r0_ WHERE r0_.dateCreation = ? AND r0_.type = ? AND r0_.reseller_id = ? AND r0_.archive = ?
【解决方案2】:

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

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();
    }

希望对同样情况的一些人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2016-01-02
    相关资源
    最近更新 更多