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

问题描述 投票:3回答:2

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

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

sql symfony filter
2个回答
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
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.