我有一个过滤条,你可以搜索名称和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)
时,当我没有输入日期时它显示为假,并显示我做的日期。所以我想这确实有效。我仍然存在的问题是它没有显示任何结果,只是一个结果为零的空白页。
我不知道你是否需要我的控制器或我的树枝来获得更好的画面?我没有把它们放在这里,因为我觉得这不是必要的,但随便问我。
你做得很好。在您的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;
}
是否有意义?
好的,我成功地完成了这项工作。这是代码。
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();
}
希望在同样的情况下帮助一些人