Installation
composer require cyber/doctrine-sharding
Add the service provider to config/app.php:
'providers' => [
Cyber\DoctrineSharding\DoctrineShardingServiceProvider::class,
],
Configuration Publish the config file:
php artisan vendor:publish --provider="Cyber\DoctrineSharding\DoctrineShardingServiceProvider"
Edit config/doctrine-sharding.php to define your shards (connections, tables, and routing rules).
First Use Case: Querying a Sharded Table
use Cyber\DoctrineSharding\ShardManager;
$shardManager = app(ShardManager::class);
$shard = $shardManager->getShardForEntity('App\Models\User', ['id' => 1]);
$user = $shard->getEntityManager()->find('App\Models\User', 1);
shardBy in config to define routing (e.g., user_id % 3).
'shards' => [
'users' => [
'shard_by' => 'user_id % 3',
'connections' => ['shard_1', 'shard_2', 'shard_3'],
],
],
$shardManager->setShardForEntity('App\Models\User', 'shard_2');
EntityManager as usual; the package handles shard resolution:
$user = $entityManager->find('App\Models\User', 1); // Automatically routed
$shard = $shardManager->getShardForEntity('App\Models\Order', ['customer_id' => 123]);
$shard->getEntityManager()->persist($order);
$shard->getEntityManager()->flush();
SHARD() in DQL for explicit shard selection:
$query = $entityManager->createQuery(
'SELECT u FROM App\Models\User u WHERE SHARD(u) = :shard'
)->setParameter('shard', 'shard_1');
EntityManager transactions normally.config/database.php.$shardManager->getShardForEntity('App\Models\User', ['id' => 1], true); // Cache hint
'debug' => true in config to log shard resolution.ShardResolver to debug routing logic:
$shardManager->setResolver(new CustomShardResolver());
ShardResolverInterface for complex routing:
class CustomShardResolver implements ShardResolverInterface {
public function resolve(string $entityName, array $criteria): string {
// Custom logic here
}
}
shard.resolved events for observability:
event(new ShardResolved($entityName, $shardName, $criteria));
default_shard in config for fallback routing.users_shard_1).config/database.php.pgsql/mysql connection pooling if shards share a database server.How can I help you explore Laravel packages today?