drjele / doctrine-utility
v5.4.0
2024-06-06 17:24 UTC
Requires
- php: >=8.2
- ext-pdo: *
- doctrine/dbal: 3.*
- doctrine/orm: 3.*
- doctrine/persistence: 3.*
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-18 08:59:37 UTC
README
已不再维护,已迁移至 https://gitlab.com/precision-soft-open-source/doctrine/utility
Doctrine 自定义类型和函数。
您可以随意进行分支和修改。.
欢迎提出建议。
用于 \Drjele\Doctrine\Utility\Repository\AbstractRepository 和 \Drjele\Doctrine\Utility\Repository\DoctrineRepository 的用法
这些类的作用是
- 为“仓库”提供更简单的构造函数注入。引号是因为这些仓库实际上是 读取服务(在 CRUD 方法中)。
- 通过使用自定义过滤器和“连接”过滤来重用代码。
- 更好的方法使用,因为您被迫仅实现所需的功能。
Product.php
namespace Acme\Domain\Product\Entity;
use Doctrine\ORM\Mapping as ORM;
use Drjele\Doctrine\Utility\Entity\CreatedTrait;
use Drjele\Doctrine\Utility\Entity\ModifiedTrait;
use Drjele\Doctrine\Utility\Repository\DoctrineRepository;
/**
* @ORM\Entity(repositoryClass=DoctrineRepository::class)
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
* @ORM\Table(options={"collate":"utf8mb4_general_ci"})
* )
*/
class Product
{
use CreatedTrait;
use ModifiedTrait;
/**
* @ORM\Id
* @ORM\Column(type="integer", options={"unsigned"=true})
* @ORM\GeneratedValue(strategy="AUTO")
*/
private ?int $id;
/**
* @ORM\Column(type="string", length=64, nullable=false, unique=true)
*/
private string $barcode;
/**
* @ORM\ManyToOne(targetEntity=ProductType::class, fetch="EXTRA_LAZY")
* @ORM\JoinColumn(nullable=false, onDelete="RESTRICT")
*/
private ProductType $productType;
}
ProductRepository.php
namespace Acme\Domain\Product\Repository;
use Acme\Domain\Product\Entity\Product;
use Acme\Domain\Product\Exception\Exception;
use Acme\Domain\Product\Exception\NotFoundException;
use Acme\Domain\Product\Repository\ProductTypeRepository;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Drjele\Doctrine\Utility\Join\JoinCollection;
use Drjele\Doctrine\Utility\Repository\AbstractRepository;
class ProductRepository extends AbstractRepository
{
public const JOIN_PRODUCT_TYPE = 'joinProductType';
public static function getEntityClass(): string
{
return Product::class;
}
public function find(int $productId): Product
{
/** @var Product $product */
$product = $this->getDoctrineRepository()->find($productId);
if (!$product) {
throw new NotFoundException('The product was not found');
}
return $product;
}
protected function attachCustomFilters(QueryBuilder $qb, array $filters): JoinCollection
{
$joins = new JoinCollection();
foreach ($filters as $key => $value) {
switch ($key) {
case 'barcodeLike':
$baseKey = \substr($key, 0, -4);
$qb->andWhere(static::getAlias() . ".{$baseKey} LIKE :{$key}")
->setParameter($key, $value);
break;
case static::JOIN_PRODUCT_TYPE:
$joins->addJoin(
new Join(
$value,
static::getAlias() . '.productType',
ProductTypeRepository::getAlias()
)
);
default:
throw new Exception(\sprintf('Invalid filter `%s` for `%s::%s`', $key, static::class, __FUNCTION__));
}
}
return $joins;
}
}
待办事项
- 单元测试。
开发
git clone git@gitlab.com:drjele-doctrine/utility.git
cd utility
rm -rf .git/hooks && ln -s ../dev/git-hooks .git/hooks
./dc build && ./dc up -d