Problème affichage données

Symfony 3

a marqué ce sujet comme résolu.

J’ai fait la commande

1
php bin/console doctrine:cache:clear-metada

Clearing ALL Metadata cache entries Successfully deleted cache entries.

Mais l’erreur est toujours là.

J’y pense mais dans mon dossier, j’ai des fichiers qui sont nommés de cette façon : Produit.php~

Est-ce que cela pourrait venir de là ?

Sinon, voici le code complet de mes trois entités :

Marchandise

 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
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Marchandises
 *
 * @ORM\Table(name="marchandises")
 * @ORM\Entity
 * @ORMInheritance("JOINED")
 * @ORMDiscriminatorColumn(name = "type", type = "string")
 * @ORMDiscriminatorMap({"prestation" = "Prestation", "produit" = "Produit"})
 */
abstract class Marchandises
{
    /**
     * @var string
     *
     * @ORM\Column(name="prix_marc", type="decimal", precision=10, scale=0, nullable=false)
     */
    private $prixMarc;

    /**
     * @var integer
     *
     * @ORM\Column(name="id_marc", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idMarc;

    /**
     * Set prixMarc
     *
     * @param string $prixMarc
     *
     * @return Marchandises
     */
    public function setPrixMarc($prixMarc)
    {
        $this->prixMarc = $prixMarc;

        return $this;
    }

    /**
     * Get prixMarc
     *
     * @return string
     */
    public function getPrixMarc()
    {
        return $this->prixMarc;
    }

    /**
     * Get idMarc
     *
     * @return integer
     */
    public function getIdMarc()
    {
        return $this->idMarc;
    }
}

Produit

  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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Produit
 *
 * @ORM\Table(name="produit", uniqueConstraints={indexes={@ORM\Index(name="produit_marchandise", columns={"fk_marc"}), @ORM\Index(name="ind_fk_media", columns={"fk_med"}), @ORM\Index(name="ind_fk_cat", columns={"fk_cat"}), @ORM\Index(name="ind_fk_type", columns={"fk_type"}), @ORM\Index(name="ind_fk_marq", columns={"fk_marq"})})
 * @ORM\Entity
 */
class Produit extends Marchandises
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_cat", type="integer", nullable=false)
     */
    private $fkCat;

    /**
     * @var integer
     *
     * @ORM\Column(name="fk_type", type="integer", nullable=false)
     */
    private $fkType;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_prod", type="text", length=255, nullable=false)
     */
    private $libelleProd;

    /**
     * @var string
     *
     * @ORM\Column(name="description_prod", type="text", length=255, nullable=false)
     */
    private $descriptionProd;

    /**
     * @var integer
     *
     * @ORM\Column(name="qte_prod", type="integer", nullable=false)
     */
    private $qteProd;

    /**
     * @var integer
     *
     * @ORM\Column(name="id_prod", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idProd;

    /**
     * @var \MPCleanCoreBundle\Entity\Media
     *
     */
    private $fkMed;


    /**
     * Set fkCat
     *
     * @param integer $fkCat
     *
     * @return Produit
     */
    public function setFkCat($fkCat)
    {
        $this->fkCat = $fkCat;

        return $this;
    }

    /**
     * Get fkCat
     *
     * @return integer
     */
    public function getFkCat()
    {
        return $this->fkCat;
    }

    /**
     * Set fkType
     *
     * @param integer $fkType
     *
     * @return Produit
     */
    public function setFkType($fkType)
    {
        $this->fkType = $fkType;

        return $this;
    }

    /**
     * Get fkType
     *
     * @return integer
     */
    public function getFkType()
    {
        return $this->fkType;
    }

    /**
     * Set fkMarq
     *
     * @param integer $fkMarq
     *
     * @return Produit
     */
    public function setFkMarq($fkMarq)
    {
        $this->fkMarq = $fkMarq;

        return $this;
    }

    /**
     * Get fkMarq
     *
     * @return integer
     */
    public function getFkMarq()
    {
        return $this->fkMarq;
    }

    /**
     * Set libelleProd
     *
     * @param string $libelleProd
     *
     * @return Produit
     */
    public function setLibelleProd($libelleProd)
    {
        $this->libelleProd = $libelleProd;

        return $this;
    }

    /**
     * Get libelleProd
     *
     * @return string
     */
    public function getLibelleProd()
    {
        return $this->libelleProd;
    }

    /**
     * Set descriptionProd
     *
     * @param string $descriptionProd
     *
     * @return Produit
     */
    public function setDescriptionProd($descriptionProd)
    {
        $this->descriptionProd = $descriptionProd;

        return $this;
    }

    /**
     * Get descriptionProd
     *
     * @return string
     */
    public function getDescriptionProd()
    {
        return $this->descriptionProd;
    }

    /**
     * Set qteProd
     *
     * @param integer $qteProd
     *
     * @return Produit
     */
    public function setQteProd($qteProd)
    {
        $this->qteProd = $qteProd;

        return $this;
    }

    /**
     * Get qteProd
     *
     * @return integer
     */
    public function getQteProd()
    {
        return $this->qteProd;
    }

    /**
     * Get idProd
     *
     * @return integer
     */
    public function getidProd()
    {
        return $this->idProd;
    }

    /**
     * Set fkMed
     *
     * @param \MPCleanCoreBundle\Entity\Media $fkMed
     *
     * @return Produit
     */
    public function setFkMed(\MPCleanCoreBundle\Entity\Media $fkMed = null)
    {
        $this->fkMed = $fkMed;

        return $this;
    }

    /**
     * Get fkMed
     *
     * @return \MPCleanCoreBundle\Entity\Media
     */
    public function getFkMed()
    {
        return $this->fkMed;
    }

    /**
     * Set fkMarc
     *
     * @param \MPCleanCoreBundle\Entity\Marchandises $fkMarc
     *
     * @return Produit
     */
    public function setFkMarc(\MPCleanCoreBundle\Entity\Marchandises $fkMarc = null)
    {
        $this->fkMarc = $fkMarc;

        return $this;
    }

    /**
     * Get fkMarc
     *
     * @return \MPCleanCoreBundle\Entity\Marchandises
     */
    public function getFkMarc()
    {
        return $this->fkMarc;
    }
}

Prestation

  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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Prestation
 *
 */
class Prestation extends Marchandises
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_art", type="integer", nullable=false)
     */
    private $fkArt;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_serv", type="text", length=65535, nullable=false)
     */
    private $libelleServ;

    /**
     * @var string
     *
     * @ORM\Column(name="description_serv", type="text", length=65535, nullable=false)
     */
    private $descriptionServ;

    /**
     * @var integer
     *
     * @ORM\Column(name="id_prestation", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idPrestation;

    /**
     * @var \MPCleanCoreBundle\Entity\Marchandises
     */
    private $fkMarc;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="MPCleanCoreBundle\Entity\OptionPrestation", inversedBy="fkMarc")
     * @ORM\JoinTable(name="contenir",
     *   joinColumns={
     *     @ORM\JoinColumn(name="fk_marc", referencedColumnName="id_prestation")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="fk_opt", referencedColumnName="id_opt")
     *   }
     * )
     */
    private $fkOpt;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->fkOpt = new \Doctrine\Common\Collections\ArrayCollection();
    }


    /**
     * Set fkArt
     *
     * @param integer $fkArt
     *
     * @return Prestation
     */
    public function setFkArt($fkArt)
    {
        $this->fkArt = $fkArt;

        return $this;
    }

    /**
     * Get fkArt
     *
     * @return integer
     */
    public function getFkArt()
    {
        return $this->fkArt;
    }

    /**
     * Set libelleServ
     *
     * @param string $libelleServ
     *
     * @return Prestation
     */
    public function setLibelleServ($libelleServ)
    {
        $this->libelleServ = $libelleServ;

        return $this;
    }

    /**
     * Get libelleServ
     *
     * @return string
     */
    public function getLibelleServ()
    {
        return $this->libelleServ;
    }

    /**
     * Set descriptionServ
     *
     * @param string $descriptionServ
     *
     * @return Prestation
     */
    public function setDescriptionServ($descriptionServ)
    {
        $this->descriptionServ = $descriptionServ;

        return $this;
    }

    /**
     * Get descriptionServ
     *
     * @return string
     */
    public function getDescriptionServ()
    {
        return $this->descriptionServ;
    }

    /**
     * Get idPrestation
     *
     * @return integer
     */
    public function getIdPrestation()
    {
        return $this->idPrestation;
    }

    /**
     * Set fkMarc
     *
     * @param \MPCleanCoreBundle\Entity\Marchandises $fkMarc
     *
     * @return Prestation
     */
    public function setFkMarc(\MPCleanCoreBundle\Entity\Marchandises $fkMarc = null)
    {
        $this->fkMarc = $fkMarc;

        return $this;
    }

    /**
     * Get fkMarc
     *
     * @return \MPCleanCoreBundle\Entity\Marchandises
     */
    public function getFkMarc()
    {
        return $this->fkMarc;
    }

    /**
     * Add fkOpt
     *
     * @param \MPCleanCoreBundle\Entity\OptionPrestation $fkOpt
     *
     * @return Prestation
     */
    public function addFkOpt(\MPCleanCoreBundle\Entity\OptionPrestation $fkOpt)
    {
        $this->fkOpt[] = $fkOpt;

        return $this;
    }

    /**
     * Remove fkOpt
     *
     * @param \MPCleanCoreBundle\Entity\OptionPrestation $fkOpt
     */
    public function removeFkOpt(\MPCleanCoreBundle\Entity\OptionPrestation $fkOpt)
    {
        $this->fkOpt->removeElement($fkOpt);
    }

    /**
     * Get fkOpt
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getFkOpt()
    {
        return $this->fkOpt;
    }
}

En sachant que Prestation a l’air de fonctionner. En tout cas, je n’ai pas d’erreur quand je vais sur la page des prestations alors que j’ai cette erreur avec les produits.

Je voulais prendre du temps pour regarder… merci d’avoir été patient.

Premier truc, toutes tes annotations d’héritage semblent manquer de \ : @ORMInheritance qui devrait être @ORM\InheritanceType, @ORMDiscriminatorColumn où il ne manque que \ entre ORM et DiscriminatorColumn, bref, à moins que ce ne soit un souci de copier-coller, ça ne va pas fonctionner comme souhaité, à regarder de plus près.

Second truc : la notation des indexes est mal faite. On a un tableau indexes imbriqué dans un tableau uniqueConstraints (d’ailleurs pas fermé) dans @ORM\Table, alors que indexes et uniqueConstraints devraient être au même niveau.

Troisième point : tu as défini des propriétés ID dans les classes "enfant", ce qui n’est pas nécessaire. Le seul ID qui existera sera dans Marchandises.

Quatrième chose : si l’entité Prestation semblait marcher, c’est parce qu’elle n’avait aucune annotation @ORM\Entity. Du coup, ses annotations n’étaient aucunement prises en compte — en somme, elle ne marchait pas  :lol:

Cinquième élément (Leelominaï Lekatariba Lamina-Tchaï Ekbat de Sedat) : tu as conservé des références à l’objet Marchandises dans Prestation comme dans Produit (fkMarc), ça ne te servira à rien. Vu que l’ID d’un Produit comme d’un Prestation sera, par extension, celui de Marchandises, parce qu’un Produit comme un Prestation est un Marchandises.

Je te remets les classes qui fonctionnaient chez moi, c’est surtout pour les mappings et une partie des attributs, pour pouvoir tester j’ai dû supprimer les références aux classes que je n’avais pas.

 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
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Marchandises
 *
 * @ORM\Table(name="marchandises")
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name = "type", type = "string")
 * @ORM\DiscriminatorMap({"prestation" = "Prestation", "produit" = "Produit"})
 */
abstract class Marchandises
{
    /**
     * @var string
     *
     * @ORM\Column(name="prix_marc", type="decimal", precision=10, scale=0, nullable=false)
     */
    private $prixMarc;

    /**
     * @var integer
     *
     * @ORM\Column(name="id_marc", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idMarc;

    /**
     * Set prixMarc
     *
     * @param string $prixMarc
     *
     * @return Marchandises
     */
    public function setPrixMarc($prixMarc)
    {
        $this->prixMarc = $prixMarc;

        return $this;
    }

    /**
     * Get prixMarc
     *
     * @return string
     */
    public function getPrixMarc()
    {
        return $this->prixMarc;
    }

    /**
     * Get idMarc
     *
     * @return integer
     */
    public function getIdMarc()
    {
        return $this->idMarc;
    }
}
Marchandises.php
  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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Produit
 *
 * @ORM\Table(name="produit",
 *  indexes={
 *      @ORM\Index(
 *          name="ind_fk_media",
 *          columns={"fk_med"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_cat",
 *          columns={"fk_cat"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_type",
 *          columns={"fk_type"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_marq",
 *          columns={"fk_marq"}
 *      )
 *  }
 * )
 * @ORM\Entity
 */
class Produit extends Marchandise
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_cat", type="integer", nullable=false)
     */
    private $fkCat;

    /**
     * @var integer
     *
     * @ORM\Column(name="fk_type", type="integer", nullable=false)
     */
    private $fkType;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_prod", type="text", length=255, nullable=false)
     */
    private $libelleProd;

    /**
     * @var string
     *
     * @ORM\Column(name="description_prod", type="text", length=255, nullable=false)
     */
    private $descriptionProd;

    /**
     * @var integer
     *
     * @ORM\Column(name="qte_prod", type="integer", nullable=false)
     */
    private $qteProd;

    /**
     * @var \MPCleanCoreBundle\Entity\Media
     *
     */
    private $fkMed;


    /**
     * Set fkCat
     *
     * @param integer $fkCat
     *
     * @return Produit
     */
    public function setFkCat($fkCat)
    {
        $this->fkCat = $fkCat;

        return $this;
    }

    /**
     * Get fkCat
     *
     * @return integer
     */
    public function getFkCat()
    {
        return $this->fkCat;
    }

    /**
     * Set fkType
     *
     * @param integer $fkType
     *
     * @return Produit
     */
    public function setFkType($fkType)
    {
        $this->fkType = $fkType;

        return $this;
    }

    /**
     * Get fkType
     *
     * @return integer
     */
    public function getFkType()
    {
        return $this->fkType;
    }

    /**
     * Set fkMarq
     *
     * @param integer $fkMarq
     *
     * @return Produit
     */
    public function setFkMarq($fkMarq)
    {
        $this->fkMarq = $fkMarq;

        return $this;
    }

    /**
     * Get fkMarq
     *
     * @return integer
     */
    public function getFkMarq()
    {
        return $this->fkMarq;
    }

    /**
     * Set libelleProd
     *
     * @param string $libelleProd
     *
     * @return Produit
     */
    public function setLibelleProd($libelleProd)
    {
        $this->libelleProd = $libelleProd;

        return $this;
    }

    /**
     * Get libelleProd
     *
     * @return string
     */
    public function getLibelleProd()
    {
        return $this->libelleProd;
    }

    /**
     * Set descriptionProd
     *
     * @param string $descriptionProd
     *
     * @return Produit
     */
    public function setDescriptionProd($descriptionProd)
    {
        $this->descriptionProd = $descriptionProd;

        return $this;
    }

    /**
     * Get descriptionProd
     *
     * @return string
     */
    public function getDescriptionProd()
    {
        return $this->descriptionProd;
    }

    /**
     * Set qteProd
     *
     * @param integer $qteProd
     *
     * @return Produit
     */
    public function setQteProd($qteProd)
    {
        $this->qteProd = $qteProd;

        return $this;
    }

    /**
     * Get qteProd
     *
     * @return integer
     */
    public function getQteProd()
    {
        return $this->qteProd;
    }

    /**
     * Set fkMarc
     *
     * @param \MPCleanCoreBundle\Entity\Marchandise $fkMarc
     *
     * @return Produit
     */
    public function setFkMarc(\MPCleanCoreBundle\Entity\Marchandise $fkMarc = null)
    {
        $this->fkMarc = $fkMarc;

        return $this;
    }

    /**
     * Get fkMarc
     *
     * @return \MPCleanCoreBundle\Entity\Marchandise
     */
    public function getFkMarc()
    {
        return $this->fkMarc;
    }
}
Produit.php
  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

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Prestation extends Marchandise
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_art", type="integer", nullable=false)
     */
    private $fkArt;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_serv", type="text", length=65535, nullable=false)
     */
    private $libelleServ;

    /**
     * @var string
     *
     * @ORM\Column(name="description_serv", type="text", length=65535, nullable=false)
     */
    private $descriptionServ;

    /**
     * @var \MPCleanCoreBundle\Entity\Marchandise
     */
    private $fkMarc;


    /**
     * Set fkArt
     *
     * @param integer $fkArt
     *
     * @return Prestation
     */
    public function setFkArt($fkArt)
    {
        $this->fkArt = $fkArt;

        return $this;
    }

    /**
     * Get fkArt
     *
     * @return integer
     */
    public function getFkArt()
    {
        return $this->fkArt;
    }

    /**
     * Set libelleServ
     *
     * @param string $libelleServ
     *
     * @return Prestation
     */
    public function setLibelleServ($libelleServ)
    {
        $this->libelleServ = $libelleServ;

        return $this;
    }

    /**
     * Get libelleServ
     *
     * @return string
     */
    public function getLibelleServ()
    {
        return $this->libelleServ;
    }

    /**
     * Set descriptionServ
     *
     * @param string $descriptionServ
     *
     * @return Prestation
     */
    public function setDescriptionServ($descriptionServ)
    {
        $this->descriptionServ = $descriptionServ;

        return $this;
    }

    /**
     * Get descriptionServ
     *
     * @return string
     */
    public function getDescriptionServ()
    {
        return $this->descriptionServ;
    }

    /**
     * Set fkMarc
     *
     * @param \MPCleanCoreBundle\Entity\Marchandise $fkMarc
     *
     * @return Prestation
     */
    public function setFkMarc(\MPCleanCoreBundle\Entity\Marchandise $fkMarc = null)
    {
        $this->fkMarc = $fkMarc;

        return $this;
    }

    /**
     * Get fkMarc
     *
     * @return \MPCleanCoreBundle\Entity\Marchandise
     */
    public function getFkMarc()
    {
        return $this->fkMarc;
    }
}
Prestation.php

Conclusion

doctrine:mapping:info est un bon allié, et ceci à prendre avec des pincettes. Du moins il semble y avoir bien plus que des relations bi-directionnelles qui sont uni-directionnelles qui résultent de la manipulation… ou alors ça ne supporte pas les schémas trop complexes. Ou pire encore, certaines séquences des "rétro-générateurs" ne sont pas propres.
Je note au passage que le système ne permet pas de convertir directement en annotations, j’espère donc que comme je t’ai demandé deux fois tu avais bien supprimé les mappings YAML ou XML récupérés par doctrine:mapping:import. Si ce n’est pas encore le cas, c’est enfin le moment de bien les faire disparaître.

+0 -0

Merci beaucoup. Je testerai ça quand j’aurai le temps.

J’ai dû mal copier les infos sur les héritages. Après, en ce qui concerne les id dans les classes enfants, j’ai été obligés de les mettre à cause de MySQL qui ne voulait pas de table sans avoir de clé primaire.

Question bête, sûrement, mais les mappings que je dois (ou devrais) supprimer, elles se trouvent où ?

Après, en ce qui concerne les id dans les classes enfants, j’ai été obligés de les mettre à cause de MySQL qui ne voulait pas de table sans avoir de clé primaire.

Charvalos

Oui, donc c’est bien probable que les mappings pris en compte ne sont pas ceux auxquels tu t’attends  ^^
Note que ceux que je t’ai fournis m’ont généré les tables comme je m’y attendais.

J’aurais dû peut-être y penser plus tôt, mais est-ce que tu ne serais pas par hasard dans ce cas ?

Ymox

Je ne pense pas.

Charvalos

Il faut vérifier correctement maintenant

Ymox

Question bête, sûrement, mais les mappings que je dois (ou devrais) supprimer, elles se trouvent où ?

Charvalos

[…] mais surtout, si vous allez regarder dans le dossier Ressources/config de votre bundle, vous y trouverez un dossier doctrine, et des fichiers *.orm.yml ou *.orm.xml, ou un dossier metadata/orm, ou d’autres trucs encore. […]

FAQ Symfony (extrait du lien "ce cas" dans un des messages précédents)

Note qu’en cas d’import, ce n’est pas forcément là, je n’ai jamais vraiment compris pourquoi. A toi de traquer des fichiers avec ces doubles extensions et qui correspondraient à tes entités.

+0 -0

Oui, même s’il y a des outils pour faire l’inverse, mais il est bien dit dans la documentation que ça demande du travail ensuite pour que ce soit correct pour Doctrine et ce qu’on veut réellement. J’avoue qu’après avoir fait ça une ou deux fois sur mes premiers projets, j’ai fini par faire plaisir à winzou et ne plus penser que métier ^^

+0 -0

Je reviens par ici.

J’ai modifié mes trois entités avec ce que tu m’avais proposé tout en rajoutant les autres relations que j’avais, ce qui me donne ceci :

Produit

 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
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Produit
 *
 * @ORM\Table(name="produit",
 *  indexes={
 *      @ORM\Index(
 *          name="ind_fk_media",
 *          columns={"fk_med"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_cat",
 *          columns={"fk_cat"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_type",
 *          columns={"fk_type"}
 *      ),
 *      @ORM\Index(
 *          name="ind_fk_marq",
 *          columns={"fk_marq"}
 *      )
 *  }
 * )
 * @ORM\Entity
 */
class Produit extends Marchandises
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_cat", type="integer", nullable=false)
     * @ORM\OneToOne(targetEntity="MPClean\MPCleanCoreBundle\Entity\Media", cascade={"persist"})
     */
    private $fkCat;

    /**
     * @var integer
     *
     * @ORM\Column(name="fk_type", type="integer", nullable=false)
     * @ORM\OneToOne(targetEntity="MPClean\MPCleanCoreBundle\Entity\TypeProduit", cascade={"persist"})
     */
    private $fkType;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_prod", type="text", length=255, nullable=false)
     */
    private $libelleProd;

    /**
     * @var string
     *
     * @ORM\Column(name="description_prod", type="text", length=255, nullable=false)
     */
    private $descriptionProd;

    /**
     * @var integer
     *
     * @ORM\Column(name="qte_prod", type="integer", nullable=false)
     */
    private $qteProd;

    /**
     * @var \MPCleanCoreBundle\Entity\Media
     * @ORM\OneToOne(targetEntity="MPClean\MPCleanCoreBundle\Entity\Media", cascade={"persist"})
     */
    private $fkMed;

Prestation

 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
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Prestation extends Marchandises
{
    /**
     * @var integer
     *
     * @ORM\Column(name="fk_art", type="integer", nullable=false)
     * @ORM\OneToOne(targetEntity="MPClean\MPCleanCoreBundle\Entity\Article", cascade={"persist"})
     */
    private $fkArt;

    /**
     * @var string
     *
     * @ORM\Column(name="libelle_serv", type="text", length=65535, nullable=false)
     */
    private $libelleServ;

    /**
     * @var string
     *
     * @ORM\Column(name="description_serv", type="text", length=65535, nullable=false)
     */
    private $descriptionServ;

    /**
     * @var \MPCleanCoreBundle\Entity\Marchandises
     */
    private $fkMarc;

Marchandise

 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
<?php

namespace MPCleanCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Marchandises
 *
 * @ORM\Table(name="marchandises")
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name = "type", type = "string")
 * @ORM\DiscriminatorMap({"prestation" = "Prestation", "produit" = "Produit"})
 */
abstract class Marchandises
{
    /**
     * @var string
     *
     * @ORM\Column(name="prix_marc", type="decimal", precision=10, scale=0, nullable=false)
     */
    private $prixMarc;

    /**
     * @var integer
     *
     * @ORM\Column(name="id_marc", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idMarc;

Quand je lance la commande php bin/console doctrine:schema:update --dump-sql, j’obtiens le message suivant :

[Doctrine\ORM\Mapping\MappingException] Entity ’MPCleanCoreBundle\Entity\Prestation’ has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported.

J’ai tenté de supprimer les trois fichiers de mappings mais il me disait qu’il les manquait pour faire la commande. Est-ce qu’il est nécessaire de supprimer les tables manuellement dans la BDD ?

J’en viens à me demande si ce n’est pas mieux que je reprenne depuis tout le début en créant les Entités une à une. x)

+0 -0

Re-bonjour, c’est de nouveau moi.

Je reviens sur ce sujet car j’ai besoin d’informations car j’ai l’impression de m’embrouiller. Après avoir laissé de côté le problème que j’avais, j’ai modifié les trois entités de ce sujet pour ensuite modifier la DB.

Sauf que, je n’arrive pas à le faire. Une fois que j’ai modifié que les trois fichiers, je supprime les trois fichiers NomEntity.orm.xml, puis je fais la commande bash php bin/console doctrine:cache:clear-metada pour vider le cache.

C’est après que cela se corse. Comment refaire ces fichiers via les trois entités ? J’ai essayé bash bin/console doctrine:mapping:import

puis ensuite, j’ai fait le schema update mais j’obtiens toujours l’erreur du composite identifier. Je ne dois pas utiliser la bonne "formule" mais je ne vois pas quoi. :colere2:

Heu, je ne te suis plus, là. Tu utilises les annotations, non ? Donc tu n’as plus besoin de ces fichiers — cf. la FAQ Symfony :

Vous avez probablement un mélange de types de mappings dans votre bundle, et Symfony ne prend jamais qu’un seul type à la fois. Plusieurs types ne cohabitent pas.

Et si tu faisais tes mappings avec du XML, pourquoi avoir mis des annotations dans tes entités ?

+0 -0

En fait, j’aimerais mettre à jour la base de données en fonction des modification des fichiers des entités que j’avais modifiés selon ce que tu m’avais donné.

Mais en fait, je pense que je vais supprimer les tables de ma BDD, refaire les entités une à une pour ensuite créer les tables en fonction des entités. Je pense que cela m’évitera pas mal de problèmes (heureusement que j’ai pu avancer sur d’autre chose en attendant)

Aucune idée.

Ils ne viennent pas de l’importation des entités depuis la BDD ?

Mais comme je l’ai dit, je vais reprendre à zéro. J’ai l’impression que c’est beaucoup + simple de créer les entités en premier et de créer les tables en fonction de ça.

Ah, oui, pardon, c’est juste, il n’est pas possible d’importer les annotations directement depuis un schéma existant, j’avais zappé…

Du coup, ça ajoute un élément fragile dans la chaîne de rétro-ingénierie… Je pense que je reprendrais aussi mes entités pour recréer le schéma, voire éventuellement les adapter aux tables dans ce cas.

Mais note bien que j’insiste : si tu utilises les annotations, dès que tu les as "rétro-générées", tu peux supprimer les autres fichiers de mappings.

+0 -0

Ok, merci de l’info.

Comme tu l’as dit, je pense que c’est mieux de refaire les entités. J’ai comme l’impression que Symfony est fait pour créer la base d’après les entités et non l’inverse, surtout quand on a pas mal de relations voir d’héritage.

Encore merci de ton aide !

Doctrine a toujours été fait pour ça, c’est par la suite que quelques outils ont été mis en place pour faire l’inverse, et quitte à me répéter, ils n’ont jamais caché que le résultat n’était pas prêt à l’emploi.

Si tu as des soucis pour faire tes mappings, n’hésite pas  ;)

+0 -0

C’est de nouveau moi ! :D

J’ai réussi à (re)créer mes entités à la main et tout va bien. Par contre, je fais face à un petit problème dont je n’arrive pas trouver de solution pour le contourner.

J’aimerais insérer des données dans ma base (pas depuis Symfony) mais depuis PHPMyAdmin.

Voici à quoi ressemble mes tables :

Produit
Marchandise

Quand je veux insérer un produit de test, le problème vient avec le champ ID :

  • Si je ne mets rien, il me dit que la valeur n’est juste
  • Si je mets 1 (par exemple), il me dit que la contraint de clé étrangère avec la table Marchandise m’empêche de l’insérer (ce qui est logique)

Du coup, comment insérer un produit qui fait référence à une marchandise ? Est-ce que je dois ajouter une marchandise en ajoutant dans la colonne discr ce que j’ai mis dans les annotations de l’entité ? Parce qu’il me semble que j’avais lu que justement, cette colonne discr, il ne fallait rien y mettre dedans nous-mêmes étant donné que c’est Symfony qui gère.

Au passage, voici le code des deux entités, si cela peut aider :

Marchandise.php

 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
<?php
/**
 * Marchandise
 *
 * @ORM\Table(name="marchandise")
 * @ORM\Entity(repositoryClass="MPCleanCoreBundle\Repository\MarchandiseRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name = "discr", type = "string")
 * @ORM\DiscriminatorMap({"produit" = "Produit", "prestation" = "Prestation"})
 */
abstract class Marchandise
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var float
     *
     * @ORM\Column(name="prix", type="float")
     */
    private $prix;
}

Produit.php

 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
<?php
/**
 * Produit
 *
 * @ORM\Table(name="produit")
 * @ORM\Entity(repositoryClass="MPCleanCoreBundle\Repository\ProduitRepository")
 */
class Produit extends Marchandise
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="libelleProd", type="string", length=50)
     */
    private $libelleProd;

    /**
     * @var string
     *
     * @ORM\Column(name="descriptionProd", type="text")
     */
    private $descriptionProd;

    /**
     * @var string
     *
     * @ORM\Column(name="qteProd", type="decimal", precision=5, scale=0)
     */
    private $qteProd;

    /**
     * @ORM\ManyToOne(targetEntity="MPCleanCoreBundle\Entity\Type")
     * @ORM\JoinColumn(nullable=false)
     */
    private $type;
}

Salut,

Tu ne dois rien mettre dans la colonne "discr" via ton code applicatif. Mais quand tu le fais à la main depuis phpMyAdmin, tu n’as pas d’autre choix que de le faire à la main. Du coup, crée une entrée dans "Marchandise" en lui renseignant le "discr" présent dans ton code, puis crée un Produit en faisant référence à ta "Marchandise".

+1 -0

(Re)Bonjour à tous !

Je vais continuer sur ce sujet car j’ai besoin d’une explication.

Pour le moment, je charge les fichiers CSS & JS de cette manière, dans Twig :

1
2
3
4
5
6
7
 {% block stylesheets %}
        <link rel="stylesheet" href="{{ asset('css/style.css') }}" type="text/css" />
    {% endblock %}

    {% block javascript %}
        <script type="text/javascript" href="{{ asset('js/jquery.min.js') }}"></script>
    {% endblock %}

J’ai remarqué que si je supprime mon fichier style.css et que j’en recrée un nouveau avec le même nom, c’est toujours l’ancien qui est pris en compte alors que si je change le nom du nouveau, cela fonctionne (j’ai remarqué la même chose avec les images).

J’ai fait un cache:clear mais cela ne change rien. Est-ce que je fait quelque chose de faux ?

Si tu utilises l’environnement de production, il faut ajouter --env="prod" à la commande de vidage du cache.

Après, il y a aussi les caches navigateurs. Chrome m’a très souvent joué des tours à ce niveau, Firefox quand il est en navigation privée aussi.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte