1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Functional\SchemaTool;
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\Table;
use Doctrine\Tests\OrmFunctionalTestCase;
use PHPUnit\Framework\Attributes\Group;
use function array_filter;
use function array_values;
use function implode;
use function str_starts_with;
class PostgreSqlSchemaToolTest extends OrmFunctionalTestCase
{
protected function setUp(): void
{
parent::setUp();
$platform = $this->_em->getConnection()->getDatabasePlatform();
if (! $platform instanceof PostgreSQLPlatform) {
self::markTestSkipped('The ' . self::class . ' requires the use of postgresql.');
}
}
#[Group('DDC-1657')]
public function testUpdateSchemaWithPostgreSQLSchema(): void
{
$sql = $this->getUpdateSchemaSqlForModels(
DDC1657Screen::class,
DDC1657Avatar::class,
);
$sql = array_filter($sql, static fn ($sql) => str_starts_with($sql, 'DROP SEQUENCE stonewood.'));
self::assertCount(0, $sql, implode("\n", $sql));
}
public function testSetDeferrableForeignKey(): void
{
$schema = $this->getSchemaForModels(
EntityWithSelfReferencingAssociation::class,
);
$table = $schema->getTable('entitywithselfreferencingassociation');
$fks = array_values($table->getForeignKeys());
self::assertCount(1, $fks);
self::assertTrue($fks[0]->getOption('deferrable'));
}
}
#[Table(name: 'stonewood.screen')]
#[Entity]
class DDC1657Screen
{
/**
* Identifier
*/
#[Id]
#[GeneratedValue(strategy: 'IDENTITY')]
#[Column(name: 'pk', type: 'integer', nullable: false)]
private int $pk;
/**
* Title
*/
#[Column(name: 'title', type: 'string', length: 255, nullable: false)]
private string $title;
/**
* Path
*/
#[Column(name: 'path', type: 'string', length: 255, nullable: false)]
private string $path;
/**
* Register date
*
* @var Date
*/
#[Column(name: 'ddate', type: 'date', nullable: false)]
private $ddate;
/**
* Avatar
*
* @var Stonewood\Model\Entity\Avatar
*/
#[ManyToOne(targetEntity: 'DDC1657Avatar')]
#[JoinColumn(name: 'pk_avatar', referencedColumnName: 'pk', nullable: true, onDelete: 'CASCADE')]
private $avatar;
}
#[Table(name: 'stonewood.avatar')]
#[Entity]
class DDC1657Avatar
{
/**
* Identifier
*/
#[Id]
#[GeneratedValue(strategy: 'IDENTITY')]
#[Column(name: 'pk', type: 'integer', nullable: false)]
private int $pk;
}
#[Table(name: 'entitywithselfreferencingassociation')]
#[Entity]
class EntityWithSelfReferencingAssociation
{
/**
* Identifier
*/
#[Id]
#[GeneratedValue(strategy: 'IDENTITY')]
#[Column(type: 'integer', nullable: false)]
private int $id;
#[ManyToOne(targetEntity: self::class)]
#[JoinColumn(deferrable: true)]
private self $parent;
}
|