symfony/orm koppeltabel

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 06-07 04:44

Douweegbertje

Wat kinderachtig.. godverdomme

Topicstarter
Ik zit even wat te testen in Symfony maar ik kom er even niet meer uit :F

Wat ik wil is het volgende: Een image tabel met diverse informatie van de image. Hierin zit ook een koppeling naar de user (van de image) met een many to one relatie (user kan meerdere images hebben).
Vervolgens heb ik nog een aparte tabel met de categorieën, echter is dit een many to many: een image kan meerdere categorieën hebben, en een categorie mag meerdere images hebben.

In feite zeg ik dan ook in de category entity dat hij een relatie heeft met de Image, inclusief jointable image_categories.

Nu genereer ik de entities en lijkt mij alles best, maar de koppeltabel wordt niet gevuld. Moet ik ook echt een entity gaan aanmaken met wat logica zodat hij dat gaat vullen? Ik ben gewoon nog niet zover in de wondere wereld van een ORM maar ik was van mening dat 'alles' nu wel goed was om ook daadwerkelijk data te inserten..

Image entity:

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

namespace CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Attribute
 *
 * @ORM\Table(name="images")
 * @ORM\Entity
 */
class Image
{

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

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

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


     /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="images")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;


    /**
     * @ORM\ManyToMany(targetEntity="Category", mappedBy="category")
     */
    protected $category;
}



Category:

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

namespace CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Attribute
 *
 * @ORM\Table(name="categories")
 * @ORM\Entity
 */
class Category
{

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

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

    /**
     * @ORM\ManyToMany(targetEntity="Image", inversedBy="category", fetch="EAGER")
     * @ORM\JoinTable(name="image_categories")
     */
    protected $images;
}

Beste antwoord (via Douweegbertje op 29-02-2016 19:45)


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

Wissel de owner eens om (zodat mappedBy en inversedBy op de andere entiteit komen te zitten).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hmail
  • Registratie: April 2003
  • Laatst online: 17:42

Hmail

Doet ook maar wat.

Wat bedoel je met 'de koppeltabel wordt niet gevuld'? Als je een Image hebt en je koppelt daar een Category aan en slaat die gegevens op, worden de id's dan niet in de koppeltabel geplaatst?

It might sound as if I have no clue what I'm doing, but I actually have a vague idea.


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 06-07 04:44

Douweegbertje

Wat kinderachtig.. godverdomme

Topicstarter
Correct..

De logica


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        $em = $this->getDoctrine()->getManager();

        $user = $this->getDoctrine()
            ->getRepository('CoreBundle:User')
            ->find(1);

        $category = new Category();
        $category->setName('Wow');

        $em->persist($category);
        $em->flush();

        $image = new Image();
        $image->setName('testImage'.$this->rS(5));
        $image->setUrl('location'.$this->rS(10).'.jpg');
        $image->setUser($user);
        $image->addCategory($category);

        $em->persist($image);
        $em->flush();


En in de image entity heb ik dan de construct die een nieuwe arraycollection ophaalt van de category en dan deze functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
  /**
     * Add category
     *
     * @param \CoreBundle\Entity\Category $category
     * @return Image
     */
    public function addCategory(\CoreBundle\Entity\Category $category)
    {
        $this->category[] = $category;

        return $this;
    }



En ik heb zelf niets gemaakt aan functies, alles is gewoon via

code:
1
php app/console doctrine:generate:entities CoreBundle



Nu ben ik gewoon in dubio of ik nog een stuk moet toevoegen voor de afhandeling van de join table, of dat ORM dat automagisch zou moeten/kunnen doen.

[ Voor 12% gewijzigd door Douweegbertje op 29-02-2016 18:58 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

Je ORM hoort dat te kunnen.

Ik weet niet of het verschil maakt, maar initialiseer je in de constructor de category als ArrayCollection?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 06-07 04:44

Douweegbertje

Wat kinderachtig.. godverdomme

Topicstarter
NMe schreef op maandag 29 februari 2016 @ 19:09:
Je ORM hoort dat te kunnen.

Ik weet niet of het verschil maakt, maar initialiseer je in de constructor de category als ArrayCollection?
PHP:
1
2
3
4
5
6
7
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->category = new \Doctrine\Common\Collections\ArrayCollection();
    }

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 15:03

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

Wissel de owner eens om (zodat mappedBy en inversedBy op de andere entiteit komen te zitten).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • +2 Henk 'm!

  • Hmail
  • Registratie: April 2003
  • Laatst online: 17:42

Hmail

Doet ook maar wat.

Dat zou hem moeten zijn inderdaad :)
http://doctrine-orm.readt...tofwork-associations.html
The owning side has to use the inversedBy attribute of the OneToOne, ManyToOne, or ManyToMany mapping declaration. The inversedBy attribute contains the name of the association-field on the inverse-side.
en
Doctrine will only check the owning side of an association for changes.
En als je lui bent:
PHP:
1
2
3
4
5
    public function addTag(Tag $tag)
{
    $tag->addArticle($this); // synchronously updating inverse side
    $this->tags[] = $tag;
}

http://doctrine-orm.readt...-a-manytomany-association

[ Voor 27% gewijzigd door Hmail op 29-02-2016 19:31 ]

It might sound as if I have no clue what I'm doing, but I actually have a vague idea.


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 06-07 04:44

Douweegbertje

Wat kinderachtig.. godverdomme

Topicstarter
Dat lijkt nu inderdaad te werken, voor 50% :+

Ik krijg nu 2 tables erbij..
image_categories & image_category

Bij de insert komen ze er nu wel in image_category, maar bij het ophalen zit er dan weer niets in..

Als ik

code:
1
2
3
4
/**
     * @ORM\ManyToMany(targetEntity="Image", inversedBy="category", fetch="EAGER")
     * @ORM\JoinTable(name="image_categories")
     */


Verander naar image_category, geeft hij aan dat er al zo'n table bestaat.
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'go.image_category' already exists.



Nevermind, dat heb ik nu gefixed :+

Ik zat alleen nog even dat ik het nu niet correct ophaal, dat heb ik weer gefixed door het stukje 'fetch' - EAGER naar de Image te zetten ipv de category.




Dus.. thanks iedereen :+ Dat ik hier nou zo lang mee bezig ben geweest :X

[ Voor 20% gewijzigd door Douweegbertje op 29-02-2016 19:46 ]

Pagina: 1