kiqcavalcanti/laravel-doctrine-filtering

使用 Laravel Doctrine 应用动态过滤器

v1.0.0 2019-12-03 14:51 UTC

This package is auto-updated.

Last update: 2024-09-29 05:55:24 UTC


README

使用 Laravel Doctrine 应用动态查询过滤器

如何使用

  • 在你的实体类中扩展 FilterEntity
  • 在你的验证器中,可以使用 isValidFilter 规则来验证 URL 参数过滤器
  • 在你的存储库中扩展 DoctrineFilterRepository 并使用 applyFilters 方法,传递查询构建器和 URL 参数过滤器作为参数。

示例

 $qb = 
   $this->_em
     ->createQueryBuilder()
     ->select($this->getEntityName()::getEntityAlias())
     ->from($this->getEntityName(), $this->getEntityName()::getEntityAlias(), $indexBy);

  $this->applyLaravelDoctrineFilters($qb, $filters);

示例

示例1

  url = https:///advertisements?filter[created_at]=2018-07-22T18:48:16-03:00
  query =
         SELECT advertisement
         FROM Entities\Advertisement advertisement
         WHERE advertisement.createdAt = '2018-07-22 18:48:16'

示例2

    url = https:///advertisements?filter[id]=1,2
    query = 
            SELECT advertisement
            FROM Entities\Advertisement advertisement
            WHERE advertisement.id IN (1, 2)

示例3

  url = https:///advertisements?filter[created_at|between]=2018-07-22T18:48:16-03:00,2018-07-22T18:48:16-03:00
  query =
         SELECT advertisement
         FROM Entities\Advertisement advertisement
         WHERE advertisement.createdAt BETWEEN '2018-07-22 18:48:16' AND '2018-07-22 18:48:16'

示例 4

  url = https:///advertisements?filter[customer_product][customer][name|like]=cor
  query =
         SELECT advertisement
         FROM Entities\Advertisement advertisement
         INNER JOIN Entities\CustomerProduct customer_product
         WITH advertisement.customerProductId = customer_product.id
         INNER JOIN Entities\Customer customer
         WITH customer_product.customerId = customer.id
         WHERE LOWER(customer.name) LIKE '%cor%'

配置带连接的过滤器

在你的实体中添加一个静态属性 $joins,其结构如下

  protected static $entityJoins [
   'customer_product' => ['entity' => CustomerProduct::class, 'condition' => 'advertisement.customerProductId = customer_product.id'],
   'site' => ['entity' => Site::class, 'condition' => 'advertisement.siteId = site.id']
 ];

OperatorEnum / 可用操作符

  case 'eq':
  case '=':
    return OperatorEnum::EQ;

  case 'neq':
  case '!=':
  case '<>':
    return OperatorEnum::NEQ;

  case 'gt':
  case '>':
    return OperatorEnum::GT;

  case 'gte':
  case '>=':
    return OperatorEnum::GTE;

  case 'lt':
  case '<':
    return OperatorEnum::LT;

  case 'lte':
  case '<=':
    return OperatorEnum::LTE;

  case 'between':
    return OperatorEnum::BETWEEN;

  case 'like':
    return OperatorEnum::LIKE;

  case 'in':
    return OperatorEnum::IN;

  case 'notin':
    return OperatorEnum::NOTIN;

  case 'isnull':
    return OperatorEnum::ISNULL;

  case 'isnotnull':
    return OperatorEnum::ISNOTNULL;