Skip to content

Instantly share code, notes, and snippets.

@t0xicCode
Last active January 27, 2021 03:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save t0xicCode/b1bb548190d1654d8532dcd96a4104b0 to your computer and use it in GitHub Desktop.
Save t0xicCode/b1bb548190d1654d8532dcd96a4104b0 to your computer and use it in GitHub Desktop.
<?php
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\ClassMetadata as MappingClassMetadata;
use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
use Doctrine\ORM\Query;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\ORM\Tools\Setup;
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
use Doctrine\Persistence\Mapping\ClassMetadata;
require_once __DIR__ . '/vendor/autoload.php';
class InternalMappingDriver implements MappingDriver
{
public function loadMetadataForClass($className, ClassMetadata $metadata)
{
$className::loadMetadata($metadata);
}
public function getAllClassNames()
{
return [
User::class,
Entry::class,
];
}
public function isTransient($className)
{
return !method_exists($className, 'loadMetadata');
}
}
class User
{
public $id;
public $name;
public $entries;
public static function loadMetadata(MappingClassMetadata $metadata)
{
$builder = new ClassMetadataBuilder($metadata);
$builder->createField('id', 'integer')->makePrimaryKey()->generatedValue()->build();
$builder->addField('name', 'string');
$builder->addOneToMany('entries', Entry::class, 'user');
}
}
class Entry
{
public $id;
public $type;
public $user;
public static function loadMetadata(MappingClassMetadata $metadata)
{
$builder = new ClassMetadataBuilder($metadata);
$builder->createField('id', 'integer')->makePrimaryKey()->generatedValue()->build();
$builder->addField('type', 'string');
$builder->createManyToOne('user', User::class)->addJoinColumn('user_id', 'id')->inversedBy('entries')->build();
}
}
$isDevMode = true;
$proxyDir = null;
$cache = null;
$useSimpleAnnotationReader = false;
$config = Setup::createConfiguration($isDevMode, $proxyDir, $cache);
$config->setMetadataDriverImpl(new InternalMappingDriver());
$conn = array(
'driver' => 'pdo_sqlite',
'path' => __DIR__ . '/db.sqlite',
);
@unlink($conn['path']);
$em = EntityManager::create($conn, $config);
print("Creating Schema" . PHP_EOL);
$s = new SchemaTool($em);
$s->createSchema(
array_map(function ($class) use ($em) {
return $em->getClassMetadata($class);
}, $config->getMetadataDriverImpl()->getAllClassNames())
);
print("Creating Users" . PHP_EOL);
for ($i = 0; $i < 4; $i++) {
$u = new User();
$u->name = 'User ID ' . $i;
$em->persist($u);
}
$em->flush();
print("Creating Entries" . PHP_EOL);
$users = $em->getRepository(User::class)->findAll();
for ($i = 0; $i < 10000; $i++) {
$e = new Entry();
$e->type = random_int(1, 100);
$e->user = $users[random_int(0, count($users) - 1)];
$em->persist($e);
}
$em->flush();
class MyDTO
{
public $count;
public function __construct($count)
{
$this->count = $count;
}
}
print(PHP_EOL);
print("Running the Query" . PHP_EOL);
$dql = <<<DQL
SELECT
u,
NEW MyDTO(COUNT(e.id))
FROM
User u
LEFT JOIN
u.entries e
GROUP BY
u.id
DQL;
$query = $em->createQuery($dql);
print("DQL:" . PHP_EOL);
print($query->getDQL());
print(PHP_EOL);
print(PHP_EOL);
print("SQL:" . PHP_EOL);
print($query->getSQL());
print(PHP_EOL);
print(PHP_EOL);
$results = $query->getResult();
print_r($results);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment