File: DDC599Test.php

package info (click to toggle)
doctrine 3.3.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 11,236 kB
  • sloc: php: 105,633; xml: 1,312; makefile: 35; sh: 14
file content (134 lines) | stat: -rw-r--r-- 3,678 bytes parent folder | download | duplicates (3)
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
133
134
<?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\DiscriminatorColumn;
use Doctrine\ORM\Mapping\DiscriminatorMap;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\InheritanceType;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\Tests\OrmFunctionalTestCase;

class DDC599Test extends OrmFunctionalTestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        $this->createSchemaForModels(
            DDC599Item::class,
            DDC599Subitem::class,
            DDC599Child::class,
        );
    }

    public function testCascadeRemoveOnInheritanceHierarchy(): void
    {
        $item          = new DDC599Subitem();
        $item->elem    = 'foo';
        $child         = new DDC599Child();
        $child->parent = $item;
        $item->getChildren()->add($child);
        $this->_em->persist($item);
        $this->_em->persist($child);
        $this->_em->flush();
        $this->_em->clear();

        $item = $this->_em->find(DDC599Item::class, $item->id);

        $this->_em->remove($item);
        $this->_em->flush(); // Should not fail

        self::assertFalse($this->_em->contains($item));
        $children = $item->getChildren();
        self::assertFalse($this->_em->contains($children[0]));

        $this->_em->clear();

        $item2       = new DDC599Subitem();
        $item2->elem = 'bar';
        $this->_em->persist($item2);
        $this->_em->flush();

        $child2         = new DDC599Child();
        $child2->parent = $item2;
        $item2->getChildren()->add($child2);
        $this->_em->persist($child2);
        $this->_em->flush();

        $this->_em->remove($item2);
        $this->_em->flush(); // should not fail

        self::assertFalse($this->_em->contains($item));
        $children = $item->getChildren();
        self::assertFalse($this->_em->contains($children[0]));
    }

    public function testCascadeRemoveOnChildren(): void
    {
        $class = $this->_em->getClassMetadata(DDC599Subitem::class);

        self::assertArrayHasKey('children', $class->associationMappings);
        self::assertTrue($class->associationMappings['children']->isCascadeRemove());
    }
}

#[Entity]
#[InheritanceType('SINGLE_TABLE')]
#[DiscriminatorColumn(name: 'type', type: 'integer')]
#[DiscriminatorMap(['0' => 'DDC599Item', '1' => 'DDC599Subitem'])]
class DDC599Item
{
    /** @var int */
    #[Id]
    #[Column(type: 'integer')]
    #[GeneratedValue(strategy: 'AUTO')]
    public $id;

    /** @phpstan-var Collection<int, DDC599Child> */
    #[OneToMany(targetEntity: 'DDC599Child', mappedBy: 'parent', cascade: ['remove'])]
    protected $children;

    public function __construct()
    {
        $this->children = new ArrayCollection();
    }

    /** @phpstan-return Collection<int, DDC599Child> */
    public function getChildren(): Collection
    {
        return $this->children;
    }
}

#[Entity]
class DDC599Subitem extends DDC599Item
{
    /** @var string */
    #[Column(type: 'string', length: 255)]
    public $elem;
}

#[Entity]
class DDC599Child
{
    /** @var int */
    #[Id]
    #[Column(type: 'integer')]
    #[GeneratedValue(strategy: 'AUTO')]
    public $id;

    /** @var DDC599Item */
    #[ManyToOne(targetEntity: 'DDC599Item', inversedBy: 'children')]
    #[JoinColumn(name: 'parentId', referencedColumnName: 'id')]
    public $parent;
}