Skip to content

Commit

Permalink
Fix creation of join table names with schemas in SQLite
Browse files Browse the repository at this point in the history
Join table name doesnt depending on the platform.
Table name was "schema.table" instead of "schema__table".

(cherry picked from commit 4878cd3)
  • Loading branch information
mairo744 authored and lcobucci committed Nov 18, 2019
1 parent 8332fa1 commit cd123e6
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ public function getJoinTableName(array $association, ClassMetadata $class, Abstr
$schema = '';

if (isset($association['joinTable']['schema'])) {
$schema = $association['joinTable']['schema'] . '.';
$schema = $association['joinTable']['schema'];
$schema .= ! $platform->supportsSchemas() && $platform->canEmulateSchemas() ? '__' : '.';
}

$tableName = $association['joinTable']['name'];
Expand Down
123 changes: 123 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/GH7079Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
<?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\DefaultQuoteStrategy;
use Doctrine\Tests\OrmFunctionalTestCase;

/**
* @group GH7079
*/
final class GH7079Test extends OrmFunctionalTestCase
{
/** @var DefaultQuoteStrategy */
private $strategy;

/** @var AbstractPlatform */
private $platform;

/**
* {@inheritDoc}
*/
protected function setUp() : void
{
parent::setUp();

$this->platform = $this->_em->getConnection()->getDatabasePlatform();
$this->strategy = new DefaultQuoteStrategy();
}

public function testGetTableName() : void
{
$table = [
'name'=>'cms_user',
'schema' => 'cms',
];

$cm = $this->createClassMetadata(GH7079CmsUser::class);
$cm->setPrimaryTable($table);

self::assertEquals($this->getTableFullName($table), $this->strategy->getTableName($cm, $this->platform));
}

public function testJoinTableName() : void
{
$table = [
'name'=>'cmsaddress_cmsuser',
'schema' => 'cms',
];

$cm = $this->createClassMetadata(GH7079CmsAddress::class);
$cm->mapManyToMany(
[
'fieldName' => 'user',
'targetEntity' => 'DDC7079CmsUser',
'inversedBy' => 'users',
'joinTable' => $table,
]
);

self::assertEquals(
$this->getTableFullName($table),
$this->strategy->getJoinTableName($cm->associationMappings['user'], $cm, $this->platform)
);
}

private function getTableFullName(array $table) : string
{
$join = '.';
if (! $this->platform->supportsSchemas() && $this->platform->canEmulateSchemas()) {
$join = '__';
}

return $table['schema'] . $join . $table['name'];
}

private function createClassMetadata(string $className) : ClassMetadata
{
$cm = new ClassMetadata($className);
$cm->initializeReflection(new RuntimeReflectionService());

return $cm;
}
}

/**
* @Entity
* @Table(name="cms_users", schema="cms")
*/
class GH7079CmsUser
{
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
public $id;

/** @OneToOne(targetEntity=GH7079CmsAddress::class, mappedBy="user", cascade={"persist"}, orphanRemoval=true) */
public $address;
}

/**
* @Entity
* @Table(name="cms_addresses", schema="cms")
*/
class GH7079CmsAddress
{
/**
* @Column(type="integer")
* @Id @GeneratedValue
*/
public $id;

/**
* @OneToOne(targetEntity=GH7079CmsUser::class, inversedBy="address")
* @JoinColumn(referencedColumnName="id")
*/
public $user;
}

0 comments on commit cd123e6

Please sign in to comment.