MongoDB 支持
Weaver ORM includes first-class support for MongoDB through a document-oriented abstraction layer. The API mirrors the relational ORM closely, so switching between SQL and MongoDB entities requires minimal mental overhead.
AbstractDocumentMapper
All MongoDB document mappers extend Weaver\ORM\MongoDB\AbstractDocumentMapper. The mapper describes the collection name, field mappings, and embedded documents.
<?php
namespace App\Mapping\Document;
use Weaver\ORM\MongoDB\AbstractDocumentMapper;
use Weaver\ORM\MongoDB\Attributes\DocumentCollection;
use Weaver\ORM\MongoDB\Attributes\Field;
use Weaver\ORM\MongoDB\Attributes\EmbedOne;
use Weaver\ORM\MongoDB\Attributes\EmbedMany;
use App\Document\Product;
#[DocumentCollection(name: 'products')]
class ProductMapper extends AbstractDocumentMapper
{
public string $document = Product::class;
#[Field(name: '_id', type: 'objectId')]
public string $id;
#[Field(type: 'string')]
public string $name;
#[Field(type: 'float')]
public float $price;
#[Field(type: 'string')]
public string $status;
#[Field(type: 'date')]
public \DateTimeImmutable $createdAt;
#[EmbedMany(document: 'App\Document\Tag')]
public array $tags = [];
#[EmbedOne(document: 'App\Document\Address')]
public ?object $shippingAddress = null;
}
#[Document] mapping
Annotate document classes with #[Document] to associate them with their mapper:
<?php
namespace App\Document;
use Weaver\ORM\MongoDB\Attributes\Document;
#[Document(mapper: \App\Mapping\Document\ProductMapper::class)]
class Product
{
public string $id;
public string $name;
public float $price;
public string $status;
public \DateTimeImmutable $createdAt;
public array $tags = [];
}
Embedded documents are plain PHP classes without the #[Document] attribute:
<?php
namespace App\Document;
class Tag
{
public function __construct(
public string $name,
public string $slug,
) {}
}
class Address
{
public string $street;
public string $city;
public string $country;
public string $postCode;
}
DocumentQueryBuilder
DocumentQueryBuilder provides a fluent API for querying MongoDB collections. It maps closely to the relational EntityQueryBuilder:
<?php
use App\Document\Product;
$products = $this->productRepository
->query()
->where('status', 'active')
->where('price', '<=', 100.0)
->orderBy('createdAt', 'DESC')
->limit(20)
->get();