Test Failed
Push — develop ( 01a8a8...14ce66 )
by Guilherme
65:10
created

DDC1170Entity::getId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Mapping;
6
7
use Doctrine\DBAL\Types\Type;
8
use Doctrine\ORM\Annotation as ORM;
9
use Doctrine\ORM\EntityManagerInterface;
10
use Doctrine\ORM\Events;
11
use Doctrine\ORM\Mapping;
12
use Doctrine\ORM\Mapping\ClassMetadata;
13
use Doctrine\ORM\Mapping\ClassMetadataFactory;
14
use Doctrine\ORM\Mapping\Factory\DefaultNamingStrategy;
15
use Doctrine\ORM\Mapping\Factory\UnderscoreNamingStrategy;
16
use Doctrine\ORM\Mapping\MappingException;
17
use Doctrine\ORM\Reflection\RuntimeReflectionService;
18
use Doctrine\Tests\Models\Cache\City;
19
use Doctrine\Tests\Models\CMS\CmsAddress;
20
use Doctrine\Tests\Models\CMS\CmsAddressListener;
21
use Doctrine\Tests\Models\CMS\CmsUser;
22
use Doctrine\Tests\Models\Company\CompanyContract;
23
use Doctrine\Tests\Models\Company\CompanyContractListener;
24
use Doctrine\Tests\Models\Company\CompanyFixContract;
25
use Doctrine\Tests\Models\Company\CompanyFlexContract;
26
use Doctrine\Tests\Models\Company\CompanyFlexUltraContract;
27
use Doctrine\Tests\Models\Company\CompanyFlexUltraContractListener;
28
use Doctrine\Tests\Models\Company\CompanyPerson;
29
use Doctrine\Tests\Models\DDC1476\DDC1476EntityWithDefaultFieldType;
30
use Doctrine\Tests\Models\DDC2825\ExplicitSchemaAndTable;
31
use Doctrine\Tests\Models\DDC2825\SchemaAndTableInTableName;
32
use Doctrine\Tests\Models\DDC3579\DDC3579Admin;
33
use Doctrine\Tests\Models\DDC5934\DDC5934Contract;
34
use Doctrine\Tests\Models\DDC869\DDC869ChequePayment;
35
use Doctrine\Tests\Models\DDC869\DDC869CreditCardPayment;
36
use Doctrine\Tests\Models\DDC869\DDC869PaymentRepository;
37
use Doctrine\Tests\Models\DDC889\DDC889Class;
38
use Doctrine\Tests\Models\DDC889\DDC889Entity;
39
use Doctrine\Tests\Models\DDC964\DDC964Admin;
40
use Doctrine\Tests\Models\DDC964\DDC964Guest;
41
use Doctrine\Tests\OrmTestCase;
42
43
abstract class AbstractMappingDriverTest extends OrmTestCase
44
{
45
    /**
46
     * @var Mapping\ClassMetadataBuildingContext
47
     */
48
    protected $metadataBuildingContext;
49
50
    public function setUp()
51
    {
52
        parent::setUp();
53
54
        $this->metadataBuildingContext = new Mapping\ClassMetadataBuildingContext(
55
            $this->createMock(ClassMetadataFactory::class),
56
            new RuntimeReflectionService()
57
        );
58
    }
59
60
    abstract protected function loadDriver();
61
62
    public function createClassMetadata($entityClassName)
63
    {
64
        $mappingDriver = $this->loadDriver();
65
66
        $class = new ClassMetadata($entityClassName, $this->metadataBuildingContext);
67
68
        $mappingDriver->loadMetadataForClass($entityClassName, $class, $this->metadataBuildingContext);
69
70
        return $class;
71
    }
72
73
    /**
74
     * @param \Doctrine\ORM\EntityManagerInterface $entityClassName
0 ignored issues
show
Bug introduced by
There is no parameter named $entityClassName. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
75
     * @return \Doctrine\ORM\Mapping\ClassMetadataFactory
76
     */
77
    protected function createClassMetadataFactory(EntityManagerInterface $em = null)
78
    {
79
        $driver     = $this->loadDriver();
80
        $em         = $em ?: $this->getTestEntityManager();
81
        $factory    = new ClassMetadataFactory();
82
83
        $em->getConfiguration()->setMetadataDriverImpl($driver);
84
85
        $factory->setEntityManager($em);
86
87
        return $factory;
88
    }
89
90
    /**
91
     * @param ClassMetadata $class
0 ignored issues
show
Bug introduced by
There is no parameter named $class. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
92
     */
93
    public function testEntityTableNameAndInheritance()
94
    {
95
        $class = $this->createClassMetadata(User::class);
96
97
        self::assertEquals('cms_users', $class->getTableName());
98
        self::assertEquals(Mapping\InheritanceType::NONE, $class->inheritanceType);
99
100
        return $class;
101
    }
102
103
    /**
104
     *
105
     * @param ClassMetadata $class
0 ignored issues
show
Bug introduced by
There is no parameter named $class. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
106
     */
107
    public function testEntityIndexes()
108
    {
109
        $class = $this->createClassMetadata('Doctrine\Tests\ORM\Mapping\User');
110
111
        self::assertCount(2, $class->table->getIndexes());
112
        self::assertEquals(
113
            [
114
                'name_idx' => [
115
                    'name'    => 'name_idx',
116
                    'columns' => ['name'],
117
                    'unique'  => false,
118
                    'options' => [],
119
                    'flags'   => [],
120
                ],
121
                0 => [
122
                    'name'    => null,
123
                    'columns' => ['user_email'],
124
                    'unique'  => false,
125
                    'options' => [],
126
                    'flags'   => [],
127
                ]
128
            ],
129
            $class->table->getIndexes()
130
        );
131
132
        return $class;
133
    }
134
135
    public function testEntityIndexFlagsAndPartialIndexes()
136
    {
137
        $class = $this->createClassMetadata(Comment::class);
138
139
        self::assertEquals(
140
            [
141
                0 => [
142
                    'name'    => null,
143
                    'columns' => ['content'],
144
                    'unique'  => false,
145
                    'flags'   => ['fulltext'],
146
                    'options' => ['where' => 'content IS NOT NULL'],
147
                ]
148
            ],
149
            $class->table->getIndexes()
150
        );
151
    }
152
153
    /**
154
     * @depends testEntityTableNameAndInheritance
155
     * @param ClassMetadata $class
156
     */
157
    public function testEntityUniqueConstraints($class)
158
    {
159
        self::assertCount(1, $class->table->getUniqueConstraints());
160
        self::assertEquals(
161
            [
162
                'search_idx' => [
163
                    'name'    => 'search_idx',
164
                    'columns' => ['name', 'user_email'],
165
                    'options' => [],
166
                    'flags'   => [],
167
                ]
168
            ],
169
            $class->table->getUniqueConstraints()
170
        );
171
172
        return $class;
173
    }
174
175
    /**
176
     * @depends testEntityTableNameAndInheritance
177
     * @param ClassMetadata $class
178
     */
179
    public function testEntityOptions($class)
180
    {
181
        self::assertCount(2, $class->table->getOptions());
182
        self::assertEquals(
183
            [
184
                'foo' => 'bar',
185
                'baz' => ['key' => 'val']
186
            ],
187
            $class->table->getOptions()
188
        );
189
190
        return $class;
191
    }
192
193
    /**
194
     * @depends testEntityOptions
195
     * @param ClassMetadata $class
196
     */
197
    public function testEntitySequence($class)
198
    {
199
        self::assertInternalType(
200
            'array',
201
            $class->getProperty('id')->getValueGenerator()->getDefinition(),
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
202
            'No Sequence Definition set on this driver.'
203
        );
204
        self::assertEquals(
205
            [
206
                'sequenceName'   => 'tablename_seq',
207
                'allocationSize' => 100,
208
            ],
209
            $class->getProperty('id')->getValueGenerator()->getDefinition()
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
210
        );
211
    }
212
213 View Code Duplication
    public function testEntityCustomGenerator()
214
    {
215
        $class = $this->createClassMetadata(Animal::class);
216
217
        self::assertEquals(Mapping\GeneratorType::CUSTOM, $class->getProperty('id')->getValueGenerator()->getType(), "Generator Type");
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
218
        self::assertEquals(
219
            [
220
                'class'     => 'stdClass',
221
                'arguments' => [],
222
            ],
223
            $class->getProperty('id')->getValueGenerator()->getDefinition(),
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
224
            "Generator Definition"
225
        );
226
    }
227
228
229
    /**
230
     * @depends testEntityTableNameAndInheritance
231
     * @param ClassMetadata $class
232
     */
233
    public function testProperties($class)
234
    {
235
        self::assertCount(7, $class->getDeclaredPropertiesIterator());
236
237
        self::assertNotNull($class->getProperty('id'));
238
        self::assertNotNull($class->getProperty('name'));
239
        self::assertNotNull($class->getProperty('email'));
240
        self::assertNotNull($class->getProperty('version'));
241
        self::assertNotNull($class->getProperty('version'));
242
243
        return $class;
244
    }
245
246
    /**
247
     * @depends testProperties
248
     * @param ClassMetadata $class
249
     */
250
    public function testVersionProperty($class)
251
    {
252
        self::assertTrue($class->isVersioned());
253
        self::assertNotNull($class->versionProperty);
254
255
        $versionPropertyName = $class->versionProperty->getName();
256
257
        self::assertEquals("version", $versionPropertyName);
258
        self::assertNotNull($class->getProperty($versionPropertyName));
259
    }
260
261
    /**
262
     * @depends testEntityTableNameAndInheritance
263
     * @param ClassMetadata $class
264
     */
265
    public function testFieldMappingsColumnNames($class)
266
    {
267
        self::assertNotNull($class->getProperty('id'));
268
        self::assertNotNull($class->getProperty('name'));
269
        self::assertNotNull($class->getProperty('email'));
270
271
        self::assertEquals("id", $class->getProperty('id')->getColumnName());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getColumnName() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
272
        self::assertEquals("name", $class->getProperty('name')->getColumnName());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getColumnName() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
273
        self::assertEquals("user_email", $class->getProperty('email')->getColumnName());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getColumnName() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
274
275
        return $class;
276
    }
277
278
    /**
279
     * @depends testEntityTableNameAndInheritance
280
     * @param ClassMetadata $class
281
     */
282
    public function testStringFieldMappings($class)
283
    {
284
        self::assertNotNull($class->getProperty('name'));
285
286
        $property = $class->getProperty('name');
287
288
        self::assertEquals('string', $property->getTypeName());
289
        self::assertEquals(50, $property->getLength());
290
        self::assertTrue($property->isNullable());
291
        self::assertTrue($property->isUnique());
292
293
        return $class;
294
    }
295
296
    /**
297
     * @depends testEntityTableNameAndInheritance
298
     *
299
     * @param ClassMetadata $class
300
     *
301
     * @return ClassMetadata
302
     */
303
    public function testFieldOptions(ClassMetadata $class)
304
    {
305
        self::assertNotNull($class->getProperty('name'));
306
307
        $property = $class->getProperty('name');
308
        $expected = ['foo' => 'bar', 'baz' => ['key' => 'val'], 'fixed' => false];
309
310
        self::assertEquals($expected, $property->getOptions());
311
312
        return $class;
313
    }
314
315
    /**
316
     * @depends testEntityTableNameAndInheritance
317
     * @param ClassMetadata $class
318
     */
319
    public function testIdFieldOptions($class)
320
    {
321
        self::assertNotNull($class->getProperty('id'));
322
323
        $property = $class->getProperty('id');
324
        $expected = ['foo' => 'bar', 'unsigned' => false];
325
326
        self::assertEquals($expected, $property->getOptions());
327
328
        return $class;
329
    }
330
331
    /**
332
     * @depends testProperties
333
     * @param ClassMetadata $class
334
     */
335 View Code Duplication
    public function testIdentifier($class)
336
    {
337
        self::assertNotNull($class->getProperty('id'));
338
339
        $property = $class->getProperty('id');
340
341
        self::assertEquals('integer', $property->getTypeName());
342
        self::assertEquals(['id'], $class->identifier);
343
        self::assertEquals(Mapping\GeneratorType::AUTO, $property->getValueGenerator()->getType(), "ID-Generator is not GeneratorType::AUTO");
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
344
345
        return $class;
346
    }
347
348
    /**
349
     * @group #6129
350
     *
351
     * @return ClassMetadata
352
     */
353
    public function testBooleanValuesForOptionIsSetCorrectly()
354
    {
355
        $class = $this->createClassMetadata(User::class);
356
357
        $idOptions = $class->getProperty('id')->getOptions();
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getOptions() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
358
        $nameOptions = $class->getProperty('name')->getOptions();
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getOptions() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
359
360
        self::assertInternalType('bool', $idOptions['unsigned']);
361
        self::assertFalse($idOptions['unsigned']);
362
        self::assertInternalType('bool', $nameOptions['fixed']);
363
        self::assertFalse($nameOptions['fixed']);
364
365
        return $class;
366
    }
367
368
    /**
369
     * @depends testProperties
370
     * @param ClassMetadata $class
371
     */
372
    public function testOwningOneToOneAssociation($class)
373
    {
374
        self::assertArrayHasKey('address', $class->getDeclaredPropertiesIterator());
375
376
        $association = $class->getProperty('address');
377
378
        self::assertTrue($association->isOwningSide());
379
        self::assertEquals('user', $association->getInversedBy());
380
        // Check cascading
381
        self::assertEquals(['remove'], $association->getCascade());
382
383
        return $class;
384
    }
385
386
    /**
387
     * @depends testOwningOneToOneAssociation
388
     * @param ClassMetadata $class
389
     */
390 View Code Duplication
    public function testInverseOneToManyAssociation($class)
391
    {
392
        self::assertArrayHasKey('phonenumbers', $class->getDeclaredPropertiesIterator());
393
394
        $association = $class->getProperty('phonenumbers');
395
396
        self::assertFalse($association->isOwningSide());
397
        self::assertTrue($association->isOrphanRemoval());
398
399
        // Check cascading
400
        self::assertEquals(['persist', 'remove'], $association->getCascade());
401
402
        // Test Order By
403
        self::assertEquals(['number' => 'ASC'], $association->getOrderBy());
404
405
        return $class;
406
    }
407
408
    /**
409
     * @depends testInverseOneToManyAssociation
410
     * @param ClassMetadata $class
411
     */
412 View Code Duplication
    public function testManyToManyAssociationWithCascadeAll($class)
413
    {
414
        self::assertArrayHasKey('groups', $class->getDeclaredPropertiesIterator());
415
416
        $association = $class->getProperty('groups');
417
418
        self::assertTrue($association->isOwningSide());
419
420
        // Make sure that cascade-all works as expected
421
        self::assertEquals(['remove', 'persist', 'refresh', 'merge', 'detach'], $association->getCascade());
422
423
        // Test Order By
424
        self::assertEquals([], $association->getOrderBy());
425
426
        return $class;
427
    }
428
429
    /**
430
     * @depends testManyToManyAssociationWithCascadeAll
431
     * @param ClassMetadata $class
432
     */
433
    public function testLifecycleCallbacks($class)
434
    {
435
        self::assertEquals(count($class->lifecycleCallbacks), 2);
436
        self::assertEquals($class->lifecycleCallbacks['prePersist'][0], 'doStuffOnPrePersist');
437
        self::assertEquals($class->lifecycleCallbacks['postPersist'][0], 'doStuffOnPostPersist');
438
439
        return $class;
440
    }
441
442
    /**
443
     * @depends testManyToManyAssociationWithCascadeAll
444
     * @param ClassMetadata $class
445
     */
446
    public function testLifecycleCallbacksSupportMultipleMethodNames($class)
447
    {
448
        self::assertEquals(count($class->lifecycleCallbacks['prePersist']), 2);
449
        self::assertEquals($class->lifecycleCallbacks['prePersist'][1], 'doOtherStuffOnPrePersistToo');
450
451
        return $class;
452
    }
453
454
    /**
455
     * @depends testLifecycleCallbacksSupportMultipleMethodNames
456
     * @param ClassMetadata $class
457
     */
458
    public function testJoinColumnUniqueAndNullable($class)
459
    {
460
        // Non-Nullability of Join Column
461
        $association = $class->getProperty('groups');
462
        $joinTable   = $association->getJoinTable();
463
        $joinColumns = $joinTable->getJoinColumns();
464
        $joinColumn  = reset($joinColumns);
465
466
        self::assertFalse($joinColumn->isNullable());
467
        self::assertFalse($joinColumn->isUnique());
468
469
        return $class;
470
    }
471
472
    /**
473
     * @depends testJoinColumnUniqueAndNullable
474
     * @param ClassMetadata $class
475
     */
476
    public function testColumnDefinition($class)
477
    {
478
        self::assertNotNull($class->getProperty('email'));
479
480
        $property           = $class->getProperty('email');
481
        $association        = $class->getProperty('groups');
482
        $joinTable          = $association->getJoinTable();
483
        $inverseJoinColumns = $joinTable->getInverseJoinColumns();
484
        $inverseJoinColumn  = reset($inverseJoinColumns);
485
486
        self::assertEquals("CHAR(32) NOT NULL", $property->getColumnDefinition());
487
        self::assertEquals("INT NULL", $inverseJoinColumn->getColumnDefinition());
488
489
        return $class;
490
    }
491
492
    /**
493
     * @depends testColumnDefinition
494
     * @param ClassMetadata $class
495
     */
496
    public function testJoinColumnOnDelete($class)
497
    {
498
        $association = $class->getProperty('address');
499
        $joinColumns = $association->getJoinColumns();
500
        $joinColumn  = reset($joinColumns);
501
502
        self::assertEquals('CASCADE', $joinColumn->getOnDelete());
503
504
        return $class;
505
    }
506
507
    /**
508
     * @group DDC-514
509
     */
510
    public function testDiscriminatorColumnDefaults()
511
    {
512
        if (strpos(get_class($this), 'PHPMappingDriver') !== false) {
513
            $this->markTestSkipped('PHP Mapping Drivers have no defaults.');
514
        }
515
516
        $class = $this->createClassMetadata(Animal::class);
517
518
        self::assertNotNull($class->discriminatorColumn);
519
520
        $discrColumn = $class->discriminatorColumn;
521
522
        self::assertEquals('Animal', $discrColumn->getTableName());
523
        self::assertEquals('discr', $discrColumn->getColumnName());
524
        self::assertEquals('string', $discrColumn->getTypeName());
525
        self::assertEquals(32, $discrColumn->getLength());
526
        self::assertNull($discrColumn->getColumnDefinition());
527
    }
528
529
    /**
530
     * @group DDC-869
531
     */
532
    public function testMappedSuperclassWithRepository()
533
    {
534
        $em      = $this->getTestEntityManager();
535
        $factory = $this->createClassMetadataFactory($em);
536
        $class   = $factory->getMetadataFor(DDC869CreditCardPayment::class);
537
538
        self::assertNotNull($class->getProperty('id'));
539
        self::assertNotNull($class->getProperty('value'));
540
        self::assertNotNull($class->getProperty('creditCardNumber'));
541
        self::assertEquals($class->getCustomRepositoryClassName(), DDC869PaymentRepository::class);
542
        self::assertInstanceOf(DDC869PaymentRepository::class, $em->getRepository(DDC869CreditCardPayment::class));
543
        self::assertTrue($em->getRepository(DDC869ChequePayment::class)->isTrue());
544
545
        $class = $factory->getMetadataFor(DDC869ChequePayment::class);
546
547
        self::assertNotNull($class->getProperty('id'));
548
        self::assertNotNull($class->getProperty('value'));
549
        self::assertNotNull($class->getProperty('serialNumber'));
550
        self::assertEquals($class->getCustomRepositoryClassName(), DDC869PaymentRepository::class);
551
        self::assertInstanceOf(DDC869PaymentRepository::class, $em->getRepository(DDC869ChequePayment::class));
552
        self::assertTrue($em->getRepository(DDC869ChequePayment::class)->isTrue());
553
    }
554
555
    /**
556
     * @group DDC-1476
557
     */
558
    public function testDefaultFieldType()
559
    {
560
        $factory = $this->createClassMetadataFactory();
561
        $class   = $factory->getMetadataFor(DDC1476EntityWithDefaultFieldType::class);
562
563
        self::assertNotNull($class->getProperty('id'));
564
        self::assertNotNull($class->getProperty('name'));
565
566
        $idProperty = $class->getProperty('id');
567
        $nameProperty = $class->getProperty('name');
568
569
        self::assertInstanceOf(Mapping\FieldMetadata::class, $idProperty);
570
        self::assertInstanceOf(Mapping\FieldMetadata::class, $nameProperty);
571
572
        self::assertEquals('string', $idProperty->getTypeName());
573
        self::assertEquals('string', $nameProperty->getTypeName());
574
575
        self::assertEquals('id', $idProperty->getName());
576
        self::assertEquals('name', $nameProperty->getName());
577
578
        self::assertEquals('id', $idProperty->getColumnName());
579
        self::assertEquals('name', $nameProperty->getColumnName());
580
581
        self::assertFalse($idProperty->hasValueGenerator());
582
    }
583
584
    /**
585
     * @group DDC-1170
586
     */
587
    public function testIdentifierColumnDefinition()
588
    {
589
        $class = $this->createClassMetadata(DDC1170Entity::class);
590
591
        self::assertNotNull($class->getProperty('id'));
592
        self::assertNotNull($class->getProperty('value'));
593
594
        self::assertEquals("INT unsigned NOT NULL", $class->getProperty('id')->getColumnDefinition());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getColumnDefinition() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
595
        self::assertEquals("VARCHAR(255) NOT NULL", $class->getProperty('value')->getColumnDefinition());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getColumnDefinition() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\FieldMetadata, Doctrine\ORM\Mapping\VersionFieldMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
596
    }
597
598
    /**
599
     * @group DDC-559
600
     */
601
    public function testNamingStrategy()
602
    {
603
        $em      = $this->getTestEntityManager();
604
        $factory = $this->createClassMetadataFactory($em);
605
606
        self::assertInstanceOf(DefaultNamingStrategy::class, $em->getConfiguration()->getNamingStrategy());
607
        $em->getConfiguration()->setNamingStrategy(new UnderscoreNamingStrategy(CASE_UPPER));
608
        self::assertInstanceOf(UnderscoreNamingStrategy::class, $em->getConfiguration()->getNamingStrategy());
609
610
        $class        = $factory->getMetadataFor(DDC1476EntityWithDefaultFieldType::class);
611
        $idProperty   = $class->getProperty('id');
612
        $nameProperty = $class->getProperty('name');
613
614
        self::assertEquals('ID', $idProperty->getColumnName());
615
        self::assertEquals('NAME', $nameProperty->getColumnName());
616
        self::assertEquals('DDC1476ENTITY_WITH_DEFAULT_FIELD_TYPE', $class->table->getName());
617
    }
618
619
    /**
620
     * @group DDC-807
621
     * @group DDC-553
622
     */
623
    public function testDiscriminatorColumnDefinition()
624
    {
625
        $class = $this->createClassMetadata(DDC807Entity::class);
626
627
        self::assertNotNull($class->discriminatorColumn);
628
629
        $discrColumn = $class->discriminatorColumn;
630
631
        self::assertEquals('dtype', $discrColumn->getColumnName());
632
        self::assertEquals("ENUM('ONE','TWO')", $discrColumn->getColumnDefinition());
633
    }
634
635
    /**
636
     * @group DDC-889
637
     */
638
    public function testInvalidEntityOrMappedSuperClassShouldMentionParentClasses()
639
    {
640
        $this->expectException(MappingException::class);
641
        $this->expectExceptionMessage('Class "Doctrine\Tests\Models\DDC889\DDC889Class" sub class of "Doctrine\Tests\Models\DDC889\DDC889SuperClass" is not a valid entity or mapped super class.');
642
643
        $this->createClassMetadata(DDC889Class::class);
644
    }
645
646
    /**
647
     * @group DDC-889
648
     */
649
    public function testIdentifierRequiredShouldMentionParentClasses()
650
    {
651
        $factory = $this->createClassMetadataFactory();
652
653
        $this->expectException(MappingException::class);
654
        $this->expectExceptionMessage('No identifier/primary key specified for Entity "Doctrine\Tests\Models\DDC889\DDC889Entity" sub class of "Doctrine\Tests\Models\DDC889\DDC889SuperClass". Every Entity must have an identifier/primary key.');
655
656
        $factory->getMetadataFor(DDC889Entity::class);
657
    }
658
659
    public function testNamedQuery()
660
    {
661
        $driver = $this->loadDriver();
662
        $class = $this->createClassMetadata(User::class);
663
664
        self::assertCount(1, $class->getNamedQueries(), sprintf("Named queries not processed correctly by driver %s", get_class($driver)));
665
    }
666
667
    /**
668
     * @group DDC-1663
669
     */
670
    public function testNamedNativeQuery()
671
    {
672
        $class = $this->createClassMetadata(CmsAddress::class);
673
674
        // named native query
675
        self::assertCount(3, $class->namedNativeQueries);
676
        self::assertArrayHasKey('find-all', $class->namedNativeQueries);
677
        self::assertArrayHasKey('find-by-id', $class->namedNativeQueries);
678
679
        $findAllQuery = $class->getNamedNativeQuery('find-all');
680
681
        self::assertEquals('mapping-find-all', $findAllQuery['resultSetMapping']);
682
        self::assertEquals('SELECT id, country, city FROM cms_addresses', $findAllQuery['query']);
683
684
        $findByIdQuery = $class->getNamedNativeQuery('find-by-id');
685
686
        self::assertEquals(CmsAddress::class,$findByIdQuery['resultClass']);
687
        self::assertEquals('SELECT * FROM cms_addresses WHERE id = ?',  $findByIdQuery['query']);
688
689
        $countQuery = $class->getNamedNativeQuery('count');
690
691
        self::assertEquals('mapping-count', $countQuery['resultSetMapping']);
692
        self::assertEquals('SELECT COUNT(*) AS count FROM cms_addresses',  $countQuery['query']);
693
694
        // result set mapping
695
        self::assertCount(3, $class->sqlResultSetMappings);
696
        self::assertArrayHasKey('mapping-count', $class->sqlResultSetMappings);
697
        self::assertArrayHasKey('mapping-find-all', $class->sqlResultSetMappings);
698
        self::assertArrayHasKey('mapping-without-fields', $class->sqlResultSetMappings);
699
700
        $findAllMapping = $class->getSqlResultSetMapping('mapping-find-all');
701
702
        self::assertEquals(CmsAddress::class, $findAllMapping['entities'][0]['entityClass']);
703
        self::assertEquals(['name'=>'id','column'=>'id'], $findAllMapping['entities'][0]['fields'][0]);
704
        self::assertEquals(['name'=>'city','column'=>'city'], $findAllMapping['entities'][0]['fields'][1]);
705
        self::assertEquals(['name'=>'country','column'=>'country'], $findAllMapping['entities'][0]['fields'][2]);
706
707
        $withoutFieldsMapping = $class->getSqlResultSetMapping('mapping-without-fields');
708
709
        self::assertEquals('__CLASS__', $withoutFieldsMapping['entities'][0]['entityClass']);
710
        self::assertEquals([], $withoutFieldsMapping['entities'][0]['fields']);
711
712
        $countMapping = $class->getSqlResultSetMapping('mapping-count');
713
714
        self::assertEquals(['name'=>'count'], $countMapping['columns'][0]);
715
716
    }
717
718
    /**
719
     * @group DDC-1663
720
     */
721
    public function testSqlResultSetMapping()
722
    {
723
        $userMetadata   = $this->createClassMetadata(CmsUser::class);
724
        $personMetadata = $this->createClassMetadata(CompanyPerson::class);
725
726
        // user asserts
727
        self::assertCount(4, $userMetadata->getSqlResultSetMappings());
728
729
        $mapping = $userMetadata->getSqlResultSetMapping('mappingJoinedAddress');
730
731
        self::assertEquals([],$mapping['columns']);
732
        self::assertEquals('mappingJoinedAddress', $mapping['name']);
733
734
        self::assertNull($mapping['entities'][0]['discriminatorColumn']);
735
736
        self::assertEquals(['name'=>'id','column'=>'id'],                   $mapping['entities'][0]['fields'][0]);
737
        self::assertEquals(['name'=>'name','column'=>'name'],               $mapping['entities'][0]['fields'][1]);
738
        self::assertEquals(['name'=>'status','column'=>'status'],           $mapping['entities'][0]['fields'][2]);
739
        self::assertEquals(['name'=>'address.zip','column'=>'zip'],         $mapping['entities'][0]['fields'][3]);
740
        self::assertEquals(['name'=>'address.city','column'=>'city'],       $mapping['entities'][0]['fields'][4]);
741
        self::assertEquals(['name'=>'address.country','column'=>'country'], $mapping['entities'][0]['fields'][5]);
742
        self::assertEquals(['name'=>'address.id','column'=>'a_id'],         $mapping['entities'][0]['fields'][6]);
743
        self::assertEquals('__CLASS__',                            $mapping['entities'][0]['entityClass']);
744
745
        $mapping = $userMetadata->getSqlResultSetMapping('mappingJoinedPhonenumber');
746
747
        self::assertEquals([],$mapping['columns']);
748
        self::assertEquals('mappingJoinedPhonenumber', $mapping['name']);
749
750
        self::assertNull($mapping['entities'][0]['discriminatorColumn']);
751
752
        self::assertEquals(['name'=>'id','column'=>'id'],                             $mapping['entities'][0]['fields'][0]);
753
        self::assertEquals(['name'=>'name','column'=>'name'],                         $mapping['entities'][0]['fields'][1]);
754
        self::assertEquals(['name'=>'status','column'=>'status'],                     $mapping['entities'][0]['fields'][2]);
755
        self::assertEquals(['name'=>'phonenumbers.phonenumber','column'=>'number'],   $mapping['entities'][0]['fields'][3]);
756
        self::assertEquals($userMetadata->getClassName(),                             $mapping['entities'][0]['entityClass']);
757
758
        $mapping = $userMetadata->getSqlResultSetMapping('mappingUserPhonenumberCount');
759
760
        self::assertEquals(['name'=>'numphones'],$mapping['columns'][0]);
761
        self::assertEquals('mappingUserPhonenumberCount', $mapping['name']);
762
763
        self::assertNull($mapping['entities'][0]['discriminatorColumn']);
764
765
        self::assertEquals(['name'=>'id','column'=>'id'],         $mapping['entities'][0]['fields'][0]);
766
        self::assertEquals(['name'=>'name','column'=>'name'],     $mapping['entities'][0]['fields'][1]);
767
        self::assertEquals(['name'=>'status','column'=>'status'], $mapping['entities'][0]['fields'][2]);
768
        self::assertEquals($userMetadata->getClassName(),         $mapping['entities'][0]['entityClass']);
769
770
        $mapping = $userMetadata->getSqlResultSetMapping('mappingMultipleJoinsEntityResults');
771
772
        self::assertEquals(['name'=>'numphones'],$mapping['columns'][0]);
773
        self::assertEquals('mappingMultipleJoinsEntityResults', $mapping['name']);
774
775
        self::assertNull($mapping['entities'][0]['discriminatorColumn']);
776
777
        self::assertEquals(['name'=>'id','column'=>'u_id'],           $mapping['entities'][0]['fields'][0]);
778
        self::assertEquals(['name'=>'name','column'=>'u_name'],       $mapping['entities'][0]['fields'][1]);
779
        self::assertEquals(['name'=>'status','column'=>'u_status'],   $mapping['entities'][0]['fields'][2]);
780
        self::assertEquals('__CLASS__',                      $mapping['entities'][0]['entityClass']);
781
782
        self::assertNull($mapping['entities'][1]['discriminatorColumn']);
783
784
        self::assertEquals(['name'=>'id','column'=>'a_id'],           $mapping['entities'][1]['fields'][0]);
785
        self::assertEquals(['name'=>'zip','column'=>'a_zip'],         $mapping['entities'][1]['fields'][1]);
786
        self::assertEquals(['name'=>'country','column'=>'a_country'], $mapping['entities'][1]['fields'][2]);
787
        self::assertEquals(CmsAddress::class,                $mapping['entities'][1]['entityClass']);
788
789
        //person asserts
790
        self::assertCount(1, $personMetadata->getSqlResultSetMappings());
791
792
        $mapping = $personMetadata->getSqlResultSetMapping('mappingFetchAll');
793
794
        self::assertEquals([], $mapping['columns']);
795
        self::assertEquals('mappingFetchAll', $mapping['name']);
796
797
        self::assertEquals('discriminator', $mapping['entities'][0]['discriminatorColumn']);
798
799
        self::assertEquals(['name'=>'id','column'=>'id'],     $mapping['entities'][0]['fields'][0]);
800
        self::assertEquals(['name'=>'name','column'=>'name'], $mapping['entities'][0]['fields'][1]);
801
        self::assertEquals('__CLASS__',              $mapping['entities'][0]['entityClass']);
802
    }
803
804
    /*
805
     * @group DDC-964
806
     */
807
    public function testAssociationOverridesMapping()
808
    {
809
        $factory        = $this->createClassMetadataFactory();
810
        $adminMetadata  = $factory->getMetadataFor(DDC964Admin::class);
811
        $guestMetadata  = $factory->getMetadataFor(DDC964Guest::class);
812
813
        // assert groups association mappings
814
        self::assertArrayHasKey('groups', $guestMetadata->getDeclaredPropertiesIterator());
815
        self::assertArrayHasKey('groups', $adminMetadata->getDeclaredPropertiesIterator());
816
817
        $guestGroups = $guestMetadata->getProperty('groups');
818
        $adminGroups = $adminMetadata->getProperty('groups');
819
820
        // assert not override attributes
821
        self::assertEquals($guestGroups->getName(), $adminGroups->getName());
822
        self::assertEquals(get_class($guestGroups), get_class($adminGroups));
823
        self::assertEquals($guestGroups->getMappedBy(), $adminGroups->getMappedBy());
824
        self::assertEquals($guestGroups->getInversedBy(), $adminGroups->getInversedBy());
825
        self::assertEquals($guestGroups->isOwningSide(), $adminGroups->isOwningSide());
826
        self::assertEquals($guestGroups->getFetchMode(), $adminGroups->getFetchMode());
827
        self::assertEquals($guestGroups->getCascade(), $adminGroups->getCascade());
828
829
         // assert not override attributes
830
        $guestGroupsJoinTable          = $guestGroups->getJoinTable();
831
        $guestGroupsJoinColumns        = $guestGroupsJoinTable->getJoinColumns();
832
        $guestGroupsJoinColumn         = reset($guestGroupsJoinColumns);
833
        $guestGroupsInverseJoinColumns = $guestGroupsJoinTable->getInverseJoinColumns();
834
        $guestGroupsInverseJoinColumn  = reset($guestGroupsInverseJoinColumns);
835
836
        self::assertEquals('ddc964_users_groups', $guestGroupsJoinTable->getName());
837
        self::assertEquals('user_id', $guestGroupsJoinColumn->getColumnName());
838
        self::assertEquals('group_id', $guestGroupsInverseJoinColumn->getColumnName());
839
840
        $adminGroupsJoinTable          = $adminGroups->getJoinTable();
841
        $adminGroupsJoinColumns        = $adminGroupsJoinTable->getJoinColumns();
842
        $adminGroupsJoinColumn         = reset($adminGroupsJoinColumns);
843
        $adminGroupsInverseJoinColumns = $adminGroupsJoinTable->getInverseJoinColumns();
844
        $adminGroupsInverseJoinColumn  = reset($adminGroupsInverseJoinColumns);
845
846
        self::assertEquals('ddc964_users_admingroups', $adminGroupsJoinTable->getName());
847
        self::assertEquals('adminuser_id', $adminGroupsJoinColumn->getColumnName());
848
        self::assertEquals('admingroup_id', $adminGroupsInverseJoinColumn->getColumnName());
849
850
        // assert address association mappings
851
        self::assertArrayHasKey('address', $guestMetadata->getDeclaredPropertiesIterator());
852
        self::assertArrayHasKey('address', $adminMetadata->getDeclaredPropertiesIterator());
853
854
        $guestAddress = $guestMetadata->getProperty('address');
855
        $adminAddress = $adminMetadata->getProperty('address');
856
857
        // assert not override attributes
858
        self::assertEquals($guestAddress->getName(), $adminAddress->getName());
859
        self::assertEquals(get_class($guestAddress), get_class($adminAddress));
860
        self::assertEquals($guestAddress->getMappedBy(), $adminAddress->getMappedBy());
861
        self::assertEquals($guestAddress->getInversedBy(), $adminAddress->getInversedBy());
862
        self::assertEquals($guestAddress->isOwningSide(), $adminAddress->isOwningSide());
863
        self::assertEquals($guestAddress->getFetchMode(), $adminAddress->getFetchMode());
864
        self::assertEquals($guestAddress->getCascade(), $adminAddress->getCascade());
865
866
        // assert override
867
        $guestAddressJoinColumns = $guestAddress->getJoinColumns();
868
        $guestAddressJoinColumn  = reset($guestAddressJoinColumns);
869
870
        self::assertEquals('address_id', $guestAddressJoinColumn->getColumnName());
871
872
        $adminAddressJoinColumns = $adminAddress->getJoinColumns();
873
        $adminAddressJoinColumn  = reset($adminAddressJoinColumns);
874
875
        self::assertEquals('adminaddress_id', $adminAddressJoinColumn->getColumnName());
876
    }
877
878
    /*
879
     * @group DDC-3579
880
     */
881
    public function testInversedByOverrideMapping()
882
    {
883
        $factory        = $this->createClassMetadataFactory();
884
        $adminMetadata  = $factory->getMetadataFor(DDC3579Admin::class);
885
886
        // assert groups association mappings
887
        self::assertArrayHasKey('groups', $adminMetadata->getDeclaredPropertiesIterator());
888
889
        $adminGroups = $adminMetadata->getProperty('groups');
890
891
        // assert override
892
        self::assertEquals('admins', $adminGroups->getInversedBy());
893
    }
894
895
    /**
896
     * @group DDC-5934
897
     */
898
    public function testFetchOverrideMapping()
899
    {
900
        // check override metadata
901
        $contractMetadata = $this->createClassMetadataFactory()->getMetadataFor(DDC5934Contract::class);
902
903
        self::assertArrayHasKey('members', $contractMetadata->getDeclaredPropertiesIterator());
904
905
        $contractMembers = $contractMetadata->getProperty('members');
906
907
        self::assertSame(Mapping\FetchMode::EXTRA_LAZY, $contractMembers->getFetchMode());
908
    }
909
910
    /**
911
     * @group DDC-964
912
     */
913
    public function testAttributeOverridesMapping()
914
    {
915
        $factory       = $this->createClassMetadataFactory();
916
        $adminMetadata = $factory->getMetadataFor(DDC964Admin::class);
917
918
        self::assertEquals(
919
            [
920
                'user_id' => 'id',
921
                'user_name' => 'name',
922
                'adminaddress_id' => 'address',
923
            ],
924
            $adminMetadata->fieldNames
925
        );
926
927
        self::assertNotNull($adminMetadata->getProperty('id'));
928
929
        $idProperty = $adminMetadata->getProperty('id');
930
931
        self::assertTrue($idProperty->isPrimaryKey());
932
        self::assertEquals('id', $idProperty->getName());
933
        self::assertEquals('user_id', $idProperty->getColumnName());
934
935
        self::assertNotNull($adminMetadata->getProperty('name'));
936
937
        $nameProperty = $adminMetadata->getProperty('name');
938
939
        self::assertEquals('name', $nameProperty->getName());
940
        self::assertEquals('user_name', $nameProperty->getColumnName());
941
        self::assertEquals(250, $nameProperty->getLength());
942
        self::assertTrue($nameProperty->isNullable());
943
        self::assertFalse($nameProperty->isUnique());
944
945
        $guestMetadata = $factory->getMetadataFor(DDC964Guest::class);
946
947
        self::assertEquals(
948
            [
949
                'guest_id' => 'id',
950
                'guest_name' => 'name',
951
                'address_id' => 'address',
952
            ],
953
            $guestMetadata->fieldNames
954
        );
955
956
        self::assertNotNull($guestMetadata->getProperty('id'));
957
958
        $idProperty = $guestMetadata->getProperty('id');
959
960
        self::assertTrue($idProperty->isPrimaryKey());
961
        self::assertEquals('id', $idProperty->getName());
962
        self::assertEquals('guest_id', $idProperty->getColumnName());
963
964
        self::assertNotNull($guestMetadata->getProperty('name'));
965
966
        $nameProperty = $guestMetadata->getProperty('name');
967
968
        self::assertEquals('name', $nameProperty->getName());
969
        self::assertEquals('guest_name', $nameProperty->getColumnName());
970
        self::assertEquals(240, $nameProperty->getLength());
971
        self::assertFalse($nameProperty->isNullable());
972
        self::assertTrue($nameProperty->isUnique());
973
    }
974
975
    /**
976
     * @group DDC-1955
977
     */
978
    public function testEntityListeners()
979
    {
980
        $factory    = $this->createClassMetadataFactory();
981
        $superClass = $factory->getMetadataFor(CompanyContract::class);
982
        $flexClass  = $factory->getMetadataFor(CompanyFixContract::class);
983
        $fixClass   = $factory->getMetadataFor(CompanyFlexContract::class);
984
985
        self::assertArrayHasKey(Events::prePersist, $superClass->entityListeners);
986
        self::assertArrayHasKey(Events::postPersist, $superClass->entityListeners);
987
988
        self::assertCount(1, $superClass->entityListeners[Events::prePersist]);
989
        self::assertCount(1, $superClass->entityListeners[Events::postPersist]);
990
991
        $postPersist = $superClass->entityListeners[Events::postPersist][0];
992
        $prePersist  = $superClass->entityListeners[Events::prePersist][0];
993
994
        self::assertEquals(CompanyContractListener::class, $postPersist['class']);
995
        self::assertEquals(CompanyContractListener::class, $prePersist['class']);
996
        self::assertEquals('postPersistHandler', $postPersist['method']);
997
        self::assertEquals('prePersistHandler', $prePersist['method']);
998
999
        //Inherited listeners
1000
        self::assertEquals($fixClass->entityListeners, $superClass->entityListeners);
1001
        self::assertEquals($flexClass->entityListeners, $superClass->entityListeners);
1002
    }
1003
1004
    /**
1005
     * @group DDC-1955
1006
     */
1007
    public function testEntityListenersOverride()
1008
    {
1009
        $factory    = $this->createClassMetadataFactory();
1010
        $ultraClass = $factory->getMetadataFor(CompanyFlexUltraContract::class);
1011
1012
        //overridden listeners
1013
        self::assertArrayHasKey(Events::postPersist, $ultraClass->entityListeners);
1014
        self::assertArrayHasKey(Events::prePersist, $ultraClass->entityListeners);
1015
1016
        self::assertCount(1, $ultraClass->entityListeners[Events::postPersist]);
1017
        self::assertCount(3, $ultraClass->entityListeners[Events::prePersist]);
1018
1019
        $postPersist = $ultraClass->entityListeners[Events::postPersist][0];
1020
        $prePersist  = $ultraClass->entityListeners[Events::prePersist][0];
1021
1022
        self::assertEquals(CompanyContractListener::class, $postPersist['class']);
1023
        self::assertEquals(CompanyContractListener::class, $prePersist['class']);
1024
        self::assertEquals('postPersistHandler', $postPersist['method']);
1025
        self::assertEquals('prePersistHandler', $prePersist['method']);
1026
1027
        $prePersist = $ultraClass->entityListeners[Events::prePersist][1];
1028
        self::assertEquals(CompanyFlexUltraContractListener::class, $prePersist['class']);
1029
        self::assertEquals('prePersistHandler1', $prePersist['method']);
1030
1031
        $prePersist = $ultraClass->entityListeners[Events::prePersist][2];
1032
        self::assertEquals(CompanyFlexUltraContractListener::class, $prePersist['class']);
1033
        self::assertEquals('prePersistHandler2', $prePersist['method']);
1034
    }
1035
1036
1037
    /**
1038
     * @group DDC-1955
1039
     */
1040
    public function testEntityListenersNamingConvention()
1041
    {
1042
        $factory  = $this->createClassMetadataFactory();
1043
        $metadata = $factory->getMetadataFor(CmsAddress::class);
1044
1045
        self::assertArrayHasKey(Events::postPersist, $metadata->entityListeners);
1046
        self::assertArrayHasKey(Events::prePersist, $metadata->entityListeners);
1047
        self::assertArrayHasKey(Events::postUpdate, $metadata->entityListeners);
1048
        self::assertArrayHasKey(Events::preUpdate, $metadata->entityListeners);
1049
        self::assertArrayHasKey(Events::postRemove, $metadata->entityListeners);
1050
        self::assertArrayHasKey(Events::preRemove, $metadata->entityListeners);
1051
        self::assertArrayHasKey(Events::postLoad, $metadata->entityListeners);
1052
        self::assertArrayHasKey(Events::preFlush, $metadata->entityListeners);
1053
1054
        self::assertCount(1, $metadata->entityListeners[Events::postPersist]);
1055
        self::assertCount(1, $metadata->entityListeners[Events::prePersist]);
1056
        self::assertCount(1, $metadata->entityListeners[Events::postUpdate]);
1057
        self::assertCount(1, $metadata->entityListeners[Events::preUpdate]);
1058
        self::assertCount(1, $metadata->entityListeners[Events::postRemove]);
1059
        self::assertCount(1, $metadata->entityListeners[Events::preRemove]);
1060
        self::assertCount(1, $metadata->entityListeners[Events::postLoad]);
1061
        self::assertCount(1, $metadata->entityListeners[Events::preFlush]);
1062
1063
        $postPersist = $metadata->entityListeners[Events::postPersist][0];
1064
        $prePersist  = $metadata->entityListeners[Events::prePersist][0];
1065
        $postUpdate  = $metadata->entityListeners[Events::postUpdate][0];
1066
        $preUpdate   = $metadata->entityListeners[Events::preUpdate][0];
1067
        $postRemove  = $metadata->entityListeners[Events::postRemove][0];
1068
        $preRemove   = $metadata->entityListeners[Events::preRemove][0];
1069
        $postLoad    = $metadata->entityListeners[Events::postLoad][0];
1070
        $preFlush    = $metadata->entityListeners[Events::preFlush][0];
1071
1072
        self::assertEquals(CmsAddressListener::class, $postPersist['class']);
1073
        self::assertEquals(CmsAddressListener::class, $prePersist['class']);
1074
        self::assertEquals(CmsAddressListener::class, $postUpdate['class']);
1075
        self::assertEquals(CmsAddressListener::class, $preUpdate['class']);
1076
        self::assertEquals(CmsAddressListener::class, $postRemove['class']);
1077
        self::assertEquals(CmsAddressListener::class, $preRemove['class']);
1078
        self::assertEquals(CmsAddressListener::class, $postLoad['class']);
1079
        self::assertEquals(CmsAddressListener::class, $preFlush['class']);
1080
1081
        self::assertEquals(Events::postPersist, $postPersist['method']);
1082
        self::assertEquals(Events::prePersist, $prePersist['method']);
1083
        self::assertEquals(Events::postUpdate, $postUpdate['method']);
1084
        self::assertEquals(Events::preUpdate, $preUpdate['method']);
1085
        self::assertEquals(Events::postRemove, $postRemove['method']);
1086
        self::assertEquals(Events::preRemove, $preRemove['method']);
1087
        self::assertEquals(Events::postLoad, $postLoad['method']);
1088
        self::assertEquals(Events::preFlush, $preFlush['method']);
1089
    }
1090
1091
    /**
1092
     * @group DDC-2183
1093
     */
1094
    public function testSecondLevelCacheMapping()
1095
    {
1096
        $factory = $this->createClassMetadataFactory();
1097
        $class   = $factory->getMetadataFor(City::class);
1098
1099
        self::assertNotNull($class->getCache());
1100
        self::assertEquals(Mapping\CacheUsage::READ_ONLY, $class->getCache()->getUsage());
1101
        self::assertEquals('doctrine_tests_models_cache_city', $class->getCache()->getRegion());
1102
1103
        self::assertArrayHasKey('state', $class->getDeclaredPropertiesIterator());
1104
1105
        $stateAssociation = $class->getProperty('state');
1106
1107
        self::assertNotNull($stateAssociation->getCache());
1108
        self::assertEquals(Mapping\CacheUsage::READ_ONLY, $stateAssociation->getCache()->getUsage());
1109
        self::assertEquals('doctrine_tests_models_cache_city__state', $stateAssociation->getCache()->getRegion());
1110
1111
        self::assertArrayHasKey('attractions', $class->getDeclaredPropertiesIterator());
1112
1113
        $attractionsAssociation = $class->getProperty('attractions');
1114
1115
        self::assertNotNull($attractionsAssociation->getCache());
1116
        self::assertEquals(Mapping\CacheUsage::READ_ONLY, $attractionsAssociation->getCache()->getUsage());
1117
        self::assertEquals('doctrine_tests_models_cache_city__attractions', $attractionsAssociation->getCache()->getRegion());
1118
    }
1119
1120
    /**
1121
     * @group DDC-2825
1122
     * @group 881
1123
     */
1124 View Code Duplication
    public function testSchemaDefinitionViaExplicitTableSchemaAnnotationProperty()
1125
    {
1126
        $factory  = $this->createClassMetadataFactory();
1127
        $metadata = $factory->getMetadataFor(ExplicitSchemaAndTable::class);
1128
1129
        self::assertSame('explicit_schema', $metadata->getSchemaName());
1130
        self::assertSame('explicit_table', $metadata->getTableName());
1131
    }
1132
1133
    /**
1134
     * @group DDC-2825
1135
     * @group 881
1136
     */
1137 View Code Duplication
    public function testSchemaDefinitionViaSchemaDefinedInTableNameInTableAnnotationProperty()
1138
    {
1139
        $factory  = $this->createClassMetadataFactory();
1140
        $metadata = $factory->getMetadataFor(SchemaAndTableInTableName::class);
1141
1142
        self::assertSame('implicit_schema', $metadata->getSchemaName());
1143
        self::assertSame('implicit_table', $metadata->getTableName());
1144
    }
1145
1146
    /**
1147
     * @group DDC-514
1148
     * @group DDC-1015
1149
     */
1150 View Code Duplication
    public function testDiscriminatorColumnDefaultLength()
1151
    {
1152
        if (strpos(get_class($this), 'PHPMappingDriver') !== false) {
1153
            $this->markTestSkipped('PHP Mapping Drivers have no defaults.');
1154
        }
1155
1156
        $class = $this->createClassMetadata(SingleTableEntityNoDiscriminatorColumnMapping::class);
1157
1158
        self::assertEquals(255, $class->discriminatorColumn->getLength());
1159
1160
        $class = $this->createClassMetadata(SingleTableEntityIncompleteDiscriminatorColumnMapping::class);
1161
1162
        self::assertEquals(255, $class->discriminatorColumn->getLength());
1163
    }
1164
1165
    /**
1166
     * @group DDC-514
1167
     * @group DDC-1015
1168
     */
1169 View Code Duplication
    public function testDiscriminatorColumnDefaultType()
1170
    {
1171
        if (strpos(get_class($this), 'PHPMappingDriver') !== false) {
1172
            $this->markTestSkipped('PHP Mapping Drivers have no defaults.');
1173
        }
1174
1175
        $class = $this->createClassMetadata(SingleTableEntityNoDiscriminatorColumnMapping::class);
1176
1177
        self::assertEquals('string', $class->discriminatorColumn->getTypeName());
1178
1179
        $class = $this->createClassMetadata(SingleTableEntityIncompleteDiscriminatorColumnMapping::class);
1180
1181
        self::assertEquals('string', $class->discriminatorColumn->getTypeName());
1182
    }
1183
1184
    /**
1185
     * @group DDC-514
1186
     * @group DDC-1015
1187
     */
1188 View Code Duplication
    public function testDiscriminatorColumnDefaultName()
1189
    {
1190
        if (strpos(get_class($this), 'PHPMappingDriver') !== false) {
1191
            $this->markTestSkipped('PHP Mapping Drivers have no defaults.');
1192
        }
1193
1194
        $class = $this->createClassMetadata(SingleTableEntityNoDiscriminatorColumnMapping::class);
1195
1196
        self::assertEquals('dtype', $class->discriminatorColumn->getColumnName());
1197
1198
        $class = $this->createClassMetadata(SingleTableEntityIncompleteDiscriminatorColumnMapping::class);
1199
1200
        self::assertEquals('dtype', $class->discriminatorColumn->getColumnName());
1201
    }
1202
}
1203
1204
/**
1205
 * @ORM\Entity
1206
 * @ORM\HasLifecycleCallbacks
1207
 * @ORM\Table(
1208
 *  name="cms_users",
1209
 *  uniqueConstraints={@ORM\UniqueConstraint(name="search_idx", columns={"name", "user_email"})},
1210
 *  indexes={@ORM\Index(name="name_idx", columns={"name"}), @ORM\Index(columns={"user_email"})},
1211
 *  options={"foo": "bar", "baz": {"key": "val"}}
1212
 * )
1213
 * @ORM\NamedQueries({@ORM\NamedQuery(name="all", query="SELECT u FROM __CLASS__ u")})
1214
 */
1215
class User
1216
{
1217
    /**
1218
     * @ORM\Id
1219
     * @ORM\Column(type="integer", options={"foo": "bar", "unsigned": false})
1220
     * @ORM\GeneratedValue(strategy="AUTO")
1221
     * @ORM\SequenceGenerator(sequenceName="tablename_seq", allocationSize=100)
1222
     **/
1223
    public $id;
1224
1225
    /**
1226
     * @ORM\Column(length=50, nullable=true, unique=true, options={"foo": "bar", "baz": {"key": "val"}, "fixed": false})
1227
     */
1228
    public $name;
1229
1230
    /**
1231
     * @ORM\Column(name="user_email", columnDefinition="CHAR(32) NOT NULL")
1232
     */
1233
    public $email;
1234
1235
    /**
1236
     * @ORM\OneToOne(targetEntity="Address", cascade={"remove"}, inversedBy="user")
1237
     * @ORM\JoinColumn(onDelete="CASCADE")
1238
     */
1239
    public $address;
1240
1241
    /**
1242
     * @ORM\OneToMany(targetEntity="Phonenumber", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
1243
     * @ORM\OrderBy({"number"="ASC"})
1244
     */
1245
    public $phonenumbers;
1246
1247
    /**
1248
     * @ORM\ManyToMany(targetEntity="Group", cascade={"all"})
1249
     * @ORM\JoinTable(name="cms_user_groups",
1250
     *    joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false, unique=false)},
1251
     *    inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id", columnDefinition="INT NULL")}
1252
     * )
1253
     */
1254
    public $groups;
1255
1256
    /**
1257
     * @ORM\Column(type="integer")
1258
     * @ORM\Version
1259
     */
1260
    public $version;
1261
1262
1263
    /**
1264
     * @ORM\PrePersist
1265
     */
1266
    public function doStuffOnPrePersist()
1267
    {
1268
    }
1269
1270
    /**
1271
     * @ORM\PrePersist
1272
     */
1273
    public function doOtherStuffOnPrePersistToo() {
1274
    }
1275
1276
    /**
1277
     * @ORM\PostPersist
1278
     */
1279
    public function doStuffOnPostPersist()
1280
    {
1281
1282
    }
1283
}
1284
1285
/**
1286
 * @ORM\Entity
1287
 * @ORM\InheritanceType("SINGLE_TABLE")
1288
 * @ORM\DiscriminatorMap({"cat" = "Cat", "dog" = "Dog"})
1289
 * @ORM\DiscriminatorColumn(name="discr", length=32, type="string")
1290
 */
1291
abstract class Animal
1292
{
1293
    /**
1294
     * @ORM\Id @ORM\Column(type="string") @ORM\GeneratedValue(strategy="CUSTOM")
1295
     * @ORM\CustomIdGenerator(class="stdClass")
1296
     */
1297
    public $id;
1298
}
1299
1300
/** @ORM\Entity */
1301
class Cat extends Animal
1302
{
1303
}
1304
1305
/** @ORM\Entity */
1306
class Dog extends Animal
1307
{
1308
}
1309
1310
/**
1311
 * @ORM\Entity
1312
 */
1313
class DDC1170Entity
1314
{
1315
    /**
1316
     * @param string $value
1317
     */
1318
    public function __construct($value = null)
1319
    {
1320
        $this->value = $value;
1321
    }
1322
1323
    /**
1324
     * @ORM\Id
1325
     * @ORM\GeneratedValue(strategy="NONE")
1326
     * @ORM\Column(type="integer", columnDefinition = "INT unsigned NOT NULL")
1327
     **/
1328
    private $id;
1329
1330
    /**
1331
     * @ORM\Column(columnDefinition = "VARCHAR(255) NOT NULL")
1332
     */
1333
    private $value;
1334
1335
    /**
1336
     * @return int
1337
     */
1338
    public function getId()
1339
    {
1340
        return $this->id;
1341
    }
1342
1343
    /**
1344
     * @return string
1345
     */
1346
    public function getValue()
1347
    {
1348
        return $this->value;
1349
    }
1350
1351
}
1352
1353
/**
1354
 * @ORM\Entity
1355
 * @ORM\InheritanceType("SINGLE_TABLE")
1356
 * @ORM\DiscriminatorMap({"ONE" = "DDC807SubClasse1", "TWO" = "DDC807SubClasse2"})
1357
 * @ORM\DiscriminatorColumn(name = "dtype", columnDefinition="ENUM('ONE','TWO')")
1358
 */
1359
class DDC807Entity
1360
{
1361
    /**
1362
     * @ORM\Id
1363
     * @ORM\Column(type="integer")
1364
     * @ORM\GeneratedValue(strategy="NONE")
1365
     **/
1366
    public $id;
1367
}
1368
1369
class DDC807SubClasse1 {}
1370
class DDC807SubClasse2 {}
1371
1372
class Address {}
1373
class Phonenumber {}
1374
class Group {}
1375
1376
/**
1377
 * @ORM\Entity
1378
 * @ORM\Table(indexes={@ORM\Index(columns={"content"}, flags={"fulltext"}, options={"where": "content IS NOT NULL"})})
1379
 */
1380
class Comment
1381
{
1382
    /**
1383
     * @ORM\Column(type="text")
1384
     */
1385
    private $content;
0 ignored issues
show
Unused Code introduced by
The property $content is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
1386
}
1387
1388
/**
1389
 * @ORM\Entity
1390
 * @ORM\InheritanceType("SINGLE_TABLE")
1391
 * @ORM\DiscriminatorMap({
1392
 *     "ONE" = "SingleTableEntityNoDiscriminatorColumnMappingSub1",
1393
 *     "TWO" = "SingleTableEntityNoDiscriminatorColumnMappingSub2"
1394
 * })
1395
 */
1396
class SingleTableEntityNoDiscriminatorColumnMapping
1397
{
1398
    /**
1399
     * @ORM\Id
1400
     * @ORM\Column(type="integer")
1401
     * @ORM\GeneratedValue(strategy="NONE")
1402
     */
1403
    public $id;
1404
}
1405
1406
/**
1407
 * @ORM\Entity
1408
 */
1409
class SingleTableEntityNoDiscriminatorColumnMappingSub1 extends SingleTableEntityNoDiscriminatorColumnMapping {}
1410
1411
/**
1412
 * @ORM\Entity
1413
 */
1414
class SingleTableEntityNoDiscriminatorColumnMappingSub2 extends SingleTableEntityNoDiscriminatorColumnMapping {}
1415
1416
/**
1417
 * @ORM\Entity
1418
 * @ORM\InheritanceType("SINGLE_TABLE")
1419
 * @ORM\DiscriminatorMap({
1420
 *     "ONE" = "SingleTableEntityIncompleteDiscriminatorColumnMappingSub1",
1421
 *     "TWO" = "SingleTableEntityIncompleteDiscriminatorColumnMappingSub2"
1422
 * })
1423
 * @ORM\DiscriminatorColumn(name="dtype")
1424
 */
1425
class SingleTableEntityIncompleteDiscriminatorColumnMapping
1426
{
1427
    /**
1428
     * @ORM\Id
1429
     * @ORM\Column(type="integer")
1430
     * @ORM\GeneratedValue(strategy="NONE")
1431
     */
1432
    public $id;
1433
}
1434
1435
class SingleTableEntityIncompleteDiscriminatorColumnMappingSub1
1436
    extends SingleTableEntityIncompleteDiscriminatorColumnMapping {}
0 ignored issues
show
Coding Style introduced by
The extends keyword must be on the same line as the class name
Loading history...
1437
1438
class SingleTableEntityIncompleteDiscriminatorColumnMappingSub2
1439
    extends SingleTableEntityIncompleteDiscriminatorColumnMapping {}
0 ignored issues
show
Coding Style introduced by
The extends keyword must be on the same line as the class name
Loading history...
1440