前一段时间,我看到一个 symfony 项目,它允许前端使用我喜欢的语法发出过滤的 api 请求:
property[operator]=value
,例如 date[gte]=value
等..有图书馆可以做这些工作吗?
谢谢
我不确定您在哪一部分遇到任何问题或您如何尝试解决问题,但您可以轻松构建它。我制作了一些伪控制器代码,展示了如何做到这一点的一种方法。
public function api(Request $request, EntityManagerInterface $em): Response
{
// Restrict fields and operators
$allowed_fields = ['field_1', 'field_2'];
$allowed_operators = ['gt', 'lt'];
$found_filters = [];
// Go through the query and look for valid filters
foreach ($request->query->all() as $fieldname => $filters) {
if (in_array($fieldname, $allowed_fields) && is_array($filters)) {
foreach ($filters as $operator => $value) {
$found_filters[$fieldname] = [$operator => $value];
}
}
}
// Example filtering using doctrine queryBuilder
$qb = $em->createQueryBuilder();
$qb->select('u')->from('User', 'u')->where('u.status = active');
foreach ($found_filters as $fieldname => $filter) {
foreach ($filter as $operator => $value) {
switch ($operator) {
case 'gt':
$qb->andWhere($qb->expr()->gt('u.' . $fieldname, ':' . $fieldname . "-" . $operator));
break;
case 'lt':
$qb->andWhere($qb->expr()->lt('u.' . $fieldname, ':' . $fieldname . "-" . $operator));
break;
}
$qb->setParameter($fieldname . "-" . $operator, $value);
}
}
$query = $qb->getQuery();
$result = $query->getResult();
}
我想您可以轻松地将其扩展以满足您的需求。恕我直言,最重要的是确保您不能在这里进行恶意或错误查询,这就是为什么我使用准备好的语句以及运算符和过滤器的白名单,确保您想在上面添加一些验证,希望它有帮助