doctrine2
* Travel
* Youtube
* rel_travel_youtube.
1 reis kan meerdere youtube filmps hebben en 1 film kan bij meerdere reizen horen.
Via de cli heb ik de 2 entiteiten gekregen:
* Travel
* Youtube
Er is dus geen entiteit van de koppeltabel aanwezig.
Beide kolommen binnen de koppeltabel zijn gedfineerd als primary key(s).
Ik loop door een feed heen en per element insert ik de data.
Wanneer een video key al bestaat, krijg ik netjes de melding terug dat de waarde al voorkomt. ( unique ), maar dan wil ik alsnog een record in de koppeltabel inschieten.. Ik krijg het maar niet voor elkaar.
Wat extra info:
Entiteit: Travel
Code (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
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
<?php
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Youtube", inversedBy="travel", cascade={"persist"})
* @ORM\JoinTable(name="rel_travel_youtube",
* joinColumns={
* @ORM\JoinColumn(name="travel_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="youtube_id", referencedColumnName="id")
* }
* )
*/
private $youtube;
/**
* Add youtube
*
* @param \Application\Entity\Youtube $youtube
* @return Travel
*/
public function addYoutube(\Application\Entity\Youtube $youtube)
{
$this->youtube[] = $youtube;
return $this;
}
?>
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Youtube", inversedBy="travel", cascade={"persist"})
* @ORM\JoinTable(name="rel_travel_youtube",
* joinColumns={
* @ORM\JoinColumn(name="travel_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="youtube_id", referencedColumnName="id")
* }
* )
*/
private $youtube;
/**
* Add youtube
*
* @param \Application\Entity\Youtube $youtube
* @return Travel
*/
public function addYoutube(\Application\Entity\Youtube $youtube)
{
$this->youtube[] = $youtube;
return $this;
}
?>
Entiteit: Youtube
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Travel", mappedBy="youtube")
*/
private $travel;
?>
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Travel", mappedBy="youtube")
*/
private $travel;
?>
Voor de mensen met kennis van Doctrine2 is mijn vraag hopelijk met deze informatie te beantwoorden.
Alvast bedankt!
Achievement unlocked: Code tags toegevoegd in een bericht van een mod ;)[/modedit]
Gewijzigd op 18/05/2014 17:36:43 door Wouter J
Code (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
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
<?php
class Travel
{
// ...
/**
* @ORM/ManyToMany(targetEntity="Movie", inversedBy="travels")
* @ORM/JoinTable(name="travels_movies")
*/
private $movies;
public function __construct() {
$this->movies = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity */
class Movie
{
// ...
/**
* @ORM/ManyToMany(targetEntity="Travel", mappedBy="movies")
*/
private $travels;
public function __construct() {
$this->travels = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
?>
class Travel
{
// ...
/**
* @ORM/ManyToMany(targetEntity="Movie", inversedBy="travels")
* @ORM/JoinTable(name="travels_movies")
*/
private $movies;
public function __construct() {
$this->movies = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity */
class Movie
{
// ...
/**
* @ORM/ManyToMany(targetEntity="Travel", mappedBy="movies")
*/
private $travels;
public function __construct() {
$this->travels = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
?>
Als je deze entities genereert dan krijg je in beiden classen een addMovie() / addTravel() method. Waneer een film al in de tabel aanwezig is doe je dan vervolgens gewoon in de enitity van DIE film de addTravel() method aanroepen. en niet vergeten de persist en flush aan te roepen natuurlijk.
Gewijzigd op 18/05/2014 18:33:05 door Frank Nietbelangrijk
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
case 'youtube_video_key':
$oObj = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( null !== $oObj )
{
$oObj->addTravel( $oTravel );
}
else
{
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
$oObjectManager->flush();
$oTravel->addYoutube( $oYoutube );
}
break;
?>
case 'youtube_video_key':
$oObj = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( null !== $oObj )
{
$oObj->addTravel( $oTravel );
}
else
{
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
$oObjectManager->flush();
$oTravel->addYoutube( $oYoutube );
}
break;
?>
De koppeltabel wordt netjes gevuld, maar in tabel ´youtube´ worden de records dubbel ingeschoten.. Wanneer ik de kolom ´video´ uniek maak, krijg ik het helemaal niet meer voor elkaar.
Ik zie $oObj die een Youtube entity in zich heeft en ik zie een $oYoutube. Waar komt die laatste vandaan?
$oYoutube = new Youtube();
???
Volgens mij is dit beter (hoop ik)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new \Application\Entity\Youtube();
}
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
$oTravel->addYoutube( $oYoutube );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush(); // je hoeft altijd maar één keer flush() aan te roepen
?>
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new \Application\Entity\Youtube();
}
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
$oTravel->addYoutube( $oYoutube );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush(); // je hoeft altijd maar één keer flush() aan te roepen
?>
Gewijzigd op 18/05/2014 20:36:27 door Frank Nietbelangrijk
Ik heb m nog iets aangepast. dus nog een keer proberen aub?
Wat jij nu doet:
- Selecteer Youtube waar video = $o->nodeValue
- Vervolgens set je video in op $o->nodeValue (dat is niet nodig, want daar heb je hem op geselecteerd)
- Je persist dan Youtube (die nog steeds hetzelfde is)
- Dan ga je met Travel aan de slag
Behalve dat het script dus eigenlijk niks doet is de persist van Youtube ook verkeerd. Persist betekend namelijk een CREATE query. Je selecteert dus eerst een Youtube object, doet daar vervolgens niks mee en zegt dan tegen Doctrine dat hij dat Youtube object in de database moet aanmaken. Dan krijg je dus 2 dezelfde rijen in je tabel. Sterker nog, als je hem nog een keer runt krijg je er 3 :)
Als je iets update (wat je hier dus niet doet) hoef je alleen maar ->flush() aan te roepen. Doctrine ontdekt zelf welke geselecteerde entities aangepast zijn en welke dus een UPDATE query nodig hebben.
Volgens mij is dit hele probleem dus slechts een verkeerd geplaatste accolade: De accolade van Regel 7 moet naar regel 11:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new \Application\Entity\Youtube();
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
}
$oTravel->addYoutube( $oYoutube );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush(); // je hoeft altijd maar één keer flush() aan te roepen
?>
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new \Application\Entity\Youtube();
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
}
$oTravel->addYoutube( $oYoutube );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush(); // je hoeft altijd maar één keer flush() aan te roepen
?>
Gewijzigd op 18/05/2014 20:44:26 door Wouter J
An exception occurred while executing 'INSERT INTO rel_travel_youtube (travel_id, youtube_id) VALUES (?, ?)' with params [5839, 47616]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5839-47616' for key 'PRIMARY'
code
Code (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
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
<?php
public function indexAction()
{
$oObjectManager = $this->getServiceLocator()->get( 'Doctrine\ORM\EntityManager' );
$oTravel = new Travel();
$oXmlReader = new \XMLReader();
foreach( $this->aXmlFiles as $sFilename )
{
$oXmlReader->open( $sFilename );
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType == \XMLReader::ELEMENT )
{
if( $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType === \XMLReader::ELEMENT )
{
$o = $oXmlReader->expand();
if( !empty( $o->nodeValue ) )
{
switch( strtolower( $o->nodeName ) )
{
case 'accommodation_name':
break;
case 'city_of_destination':
break;
case 'country_of_destination':
break;
case 'description':
$oTravel->setDescription( $o->nodeValue );
break;
case 'img_medium':
$oTravel->setImgMedium( $o->nodeValue );
break;
case 'link':
$oTravel->setLink( $o->nodeValue );
break;
case 'min_nr_people':
$oTravel->setNrOfGuests( $o->nodeValue );
break;
case 'minimum_price':
$oTravel->setPrice( $o->nodeValue );
break;
case 'region_of_destination':
break;
case 'title':
$oSeoUrl = $this->getServiceLocator()->get( 'SeoUrl\Slug' );
$oTravel->setName( $o->nodeValue );
$oTravel->setSlug( $oSeoUrl->create( $o->nodeValue ) );
break;
case 'youtube_video_key':
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new Youtube();
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
}
$oTravel->addYoutube( $oYoutube );
break;
}
}
}
if( $oXmlReader->nodeType == \XMLReader::END_ELEMENT && $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
$oTravel->setStatus( self::ACTIVE );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
}
}
}
}
}
}
return new ViewModel();
}
?>
public function indexAction()
{
$oObjectManager = $this->getServiceLocator()->get( 'Doctrine\ORM\EntityManager' );
$oTravel = new Travel();
$oXmlReader = new \XMLReader();
foreach( $this->aXmlFiles as $sFilename )
{
$oXmlReader->open( $sFilename );
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType == \XMLReader::ELEMENT )
{
if( $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType === \XMLReader::ELEMENT )
{
$o = $oXmlReader->expand();
if( !empty( $o->nodeValue ) )
{
switch( strtolower( $o->nodeName ) )
{
case 'accommodation_name':
break;
case 'city_of_destination':
break;
case 'country_of_destination':
break;
case 'description':
$oTravel->setDescription( $o->nodeValue );
break;
case 'img_medium':
$oTravel->setImgMedium( $o->nodeValue );
break;
case 'link':
$oTravel->setLink( $o->nodeValue );
break;
case 'min_nr_people':
$oTravel->setNrOfGuests( $o->nodeValue );
break;
case 'minimum_price':
$oTravel->setPrice( $o->nodeValue );
break;
case 'region_of_destination':
break;
case 'title':
$oSeoUrl = $this->getServiceLocator()->get( 'SeoUrl\Slug' );
$oTravel->setName( $o->nodeValue );
$oTravel->setSlug( $oSeoUrl->create( $o->nodeValue ) );
break;
case 'youtube_video_key':
$oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) );
if( $oYoutube == null )
{
$oYoutube = new Youtube();
$oYoutube->setVideo( $o->nodeValue );
$oObjectManager->persist( $oYoutube );
}
$oTravel->addYoutube( $oYoutube );
break;
}
}
}
if( $oXmlReader->nodeType == \XMLReader::END_ELEMENT && $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
$oTravel->setStatus( self::ACTIVE );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
}
}
}
}
}
}
return new ViewModel();
}
?>
Toevoeging op 18/05/2014 22:03:13:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
$oObjectManager->clear();
?>
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
$oObjectManager->clear();
?>
Ik heb clear() nog aan het einde toegevoegd en dan krijg ik de melding:
An exception occurred while executing 'INSERT INTO youtube (video) VALUES (?)' with params ["1XHA0t0zHFo"]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1XHA0t0zHFo' for key 'video'
Toevoeging op 18/05/2014 22:05:33:
rel_travel_youtube
Gedeelde primary key & de volgende query nog uitgevoerd:
ALTER TABLE `rel_travel_youtube` DROP FOREIGN KEY `rel_travel_youtube_ibfk_1`; ALTER TABLE `rel_travel_youtube` ADD CONSTRAINT `rel_travel_youtube_ibfk_1` FOREIGN KEY (`travel_id`) REFERENCES `vacation`.`travel`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `rel_travel_youtube` DROP FOREIGN KEY `rel_travel_youtube_ibfk_2`; ALTER TABLE `rel_travel_youtube` ADD CONSTRAINT `rel_travel_youtube_ibfk_2` FOREIGN KEY (`youtube_id`) REFERENCES `vacation`.`youtube`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
De foutmelding is wel duidelijk toch? Duplicate entry '5839-47616' for key 'PRIMARY'
Ik wil een nieuw record in rel_travel_youtube, dat wel.
Omdat ze een relatie met elkaar hebben, zal de insert waarschijnlijk wel dubbel uitgevoerd worden met als resultaat een duplicate entry..
Het gaat nu wel om deze trouwens: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1XHA0t0zHFo' for key 'video'
Waarom denk je de hele tijd aan de koppeltabel terwijl je met doctrine hier totaal geen omkijken naar hebt?
Toevoeging op 18/05/2014 23:18:03:
Ga je nu zelf die koppeltabel handmatig zitten veranderen?
Gewijzigd op 18/05/2014 22:50:19 door Frank Nietbelangrijk
* id
* name
rel_travel_youtube
* travel_id
* youtube_id
youtube
* id
* video
De relaties zoals ze zijn staan hierboven vermeld.
Ik heb de entiteiten laten genereren dmv: orm:convert-mapping. Hierdoor het ik de beschikking over de entiteiten: Youtube & Travel.
Als ik de youtube entiteit vul, en deze toevoeg aan Travel dmv: $oTravel->addYoutube( $oYoutube ), wordt deze geplaatst in de youtube tabel en is er een record bijgekomen in de rel_travel_youtube tabel.
So far so good. Hopelijk voor jullie ook nog helder.
de kolom: video, is uniek. En bij een een volgende keer dat ik een record wil inschieten met dezelfde video key, krijg ik een error dat het record al bestaat, wat ook logisch is.
Maar ik wil het ID van dat record gebruiken, om in rel_travel_youtube een nieuw record te maken.
Denk ik verkeerd o.i.d.? Ik hoor het graag!
Gewijzigd op 19/05/2014 14:14:28 door Erik Rijk
Volgens mij is het antwoord dat je één film aan meerdere reizen kunt koppelen.
Je hoeft met doctrine nooit en te nimmer eigenhandig aan een koppeltabel te knoeien.
Wat jij doet zoals je het verteld: een record proberen toe te voegen aan de tabel youtube en afwachten of er een foutmelding komt. Draai die gedachte nou eens om en doe dan dit:
... ->findOneBy( array( 'video' => $youtubeCode )
Er kunnen nu twee dingen gebeuren: Je krijgt een entity terug met alle velden ingevuld van het gevonden record OF je krijgt een NULL terug als de youtube-code dus niet in de database voorkomt.
Vervolgens is het eigenlijk heel simpel:
Indien NULL: Creëer een nieuwe youtube entity, roep alle setters aan om de properties de juiste waarden te geven en roep addTravel aan om aan de youtube entity een travel te hangen. (welke je al in je database zou moeten hebben staan).
Indien je een entity terugkrijgt:
Hoef je enkel de addTravel aan te roepen. Immers het record bestaat al in de database maar je wilt een extra record in de koppeltabel.
Gewijzigd op 19/05/2014 17:16:39 door Frank Nietbelangrijk
An exception occurred while executing 'INSERT INTO youtube (video) VALUES (?)' with params ["1XHA0t0zHFo"]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1XHA0t0zHFo' for key 'video'
Wordt er door de addYoutube() functie niet geprobeerd om het record in in de youtube tabel in te schieten?
Ik kan niks anders bedenken
Toevoeging op 19/05/2014 19:04:49:
Als ik aangeef dat de kolom 'video' niet uniek is, krijg ik allemaal record met dezelfde waarde in de kolom, maar in de koppeltabel gaat het wel automatisch goed.
Erik Rijk op 19/05/2014 19:01:08:
Als ik aangeef dat de kolom 'video' niet uniek is, krijg ik allemaal record met dezelfde waarde in de kolom, maar in de koppeltabel gaat het wel automatisch goed.
Dan gaat er nog iets mis met het persisten naar je database. Je probeert een bestaande entity nogmaals te INSERTEN
Op basis van het geheel.. Wat raad je aan?
Code (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
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
<?php
public function indexAction()
{
$oObjectManager = $this->getServiceLocator()->get( 'Doctrine\ORM\EntityManager' );
$oTravel = new Travel();
$oXmlReader = new \XMLReader();
foreach( $this->aXmlFiles as $sFilename )
{
$oXmlReader->open( $sFilename );
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType == \XMLReader::ELEMENT )
{
if( $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType === \XMLReader::ELEMENT )
{
$o = $oXmlReader->expand();
if( !empty( $o->nodeValue ) )
{
switch( strtolower( $o->nodeName ) )
{
case 'accommodation_name':
break;
case 'city_of_destination':
if( null === ( $oCity = $oObjectManager->getRepository( '\Application\Entity\City' )->findOneBy( array( 'name' => $o->nodeValue ) ) ) )
{
$oCity = new City();
$oCity->setName( $o->nodeValue );
$oObjectManager->persist( $oCity );
}
$oTravel->setCity( $oCity );
break;
case 'country_of_destination':
if( null === ( $oCountry = $oObjectManager->getRepository( '\Application\Entity\Country' )->findOneBy( array( 'abbreviation' => $o->nodeValue ) ) ) )
{
$oCountry = new Country();
$oCountry->setAbbreviation( $o->nodeValue );
$oCountry->setName( $o->nodeValue );
$oObjectManager->persist( $oCountry );
}
$oTravel->setCountry( $oCountry );
break;
case 'description':
$oTravel->setDescription( $o->nodeValue );
break;
case 'img_medium':
$oTravel->setImgMedium( $o->nodeValue );
break;
case 'link':
$oTravel->setLink( $o->nodeValue );
break;
case 'min_nr_people':
$oTravel->setNrOfGuests( $o->nodeValue );
break;
case 'minimum_price':
$oTravel->setPrice( $o->nodeValue );
break;
case 'region_of_destination':
if( null === ( $oRegion = $oObjectManager->getRepository( '\Application\Entity\Region' )->findOneBy( array( 'name' => $o->nodeValue ) ) ) )
{
$oRegion = new Region();
$oRegion->setName( $o->nodeValue );
$oObjectManager->persist( $oRegion );
}
$oTravel->setRegion( $oRegion );
break;
case 'title':
$oSeoUrl = $this->getServiceLocator()->get( 'SeoUrl\Slug' );
$oTravel->setName( $o->nodeValue );
$oTravel->setSlug( $oSeoUrl->create( $o->nodeValue ) );
break;
case 'youtube_video_key':
// if( null === ( $oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) ) ) )
// {
// $oYoutube = new Youtube();
// $oYoutube->setVideo( $o->nodeValue );
// }
break;
}
}
}
if( $oXmlReader->nodeType == \XMLReader::END_ELEMENT && $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
$oTravel->setStatus( self::ACTIVE );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
$oObjectManager->clear();
}
}
}
}
}
}
return new ViewModel();
}
?>
public function indexAction()
{
$oObjectManager = $this->getServiceLocator()->get( 'Doctrine\ORM\EntityManager' );
$oTravel = new Travel();
$oXmlReader = new \XMLReader();
foreach( $this->aXmlFiles as $sFilename )
{
$oXmlReader->open( $sFilename );
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType == \XMLReader::ELEMENT )
{
if( $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
while( $oXmlReader->read() )
{
if( $oXmlReader->nodeType === \XMLReader::ELEMENT )
{
$o = $oXmlReader->expand();
if( !empty( $o->nodeValue ) )
{
switch( strtolower( $o->nodeName ) )
{
case 'accommodation_name':
break;
case 'city_of_destination':
if( null === ( $oCity = $oObjectManager->getRepository( '\Application\Entity\City' )->findOneBy( array( 'name' => $o->nodeValue ) ) ) )
{
$oCity = new City();
$oCity->setName( $o->nodeValue );
$oObjectManager->persist( $oCity );
}
$oTravel->setCity( $oCity );
break;
case 'country_of_destination':
if( null === ( $oCountry = $oObjectManager->getRepository( '\Application\Entity\Country' )->findOneBy( array( 'abbreviation' => $o->nodeValue ) ) ) )
{
$oCountry = new Country();
$oCountry->setAbbreviation( $o->nodeValue );
$oCountry->setName( $o->nodeValue );
$oObjectManager->persist( $oCountry );
}
$oTravel->setCountry( $oCountry );
break;
case 'description':
$oTravel->setDescription( $o->nodeValue );
break;
case 'img_medium':
$oTravel->setImgMedium( $o->nodeValue );
break;
case 'link':
$oTravel->setLink( $o->nodeValue );
break;
case 'min_nr_people':
$oTravel->setNrOfGuests( $o->nodeValue );
break;
case 'minimum_price':
$oTravel->setPrice( $o->nodeValue );
break;
case 'region_of_destination':
if( null === ( $oRegion = $oObjectManager->getRepository( '\Application\Entity\Region' )->findOneBy( array( 'name' => $o->nodeValue ) ) ) )
{
$oRegion = new Region();
$oRegion->setName( $o->nodeValue );
$oObjectManager->persist( $oRegion );
}
$oTravel->setRegion( $oRegion );
break;
case 'title':
$oSeoUrl = $this->getServiceLocator()->get( 'SeoUrl\Slug' );
$oTravel->setName( $o->nodeValue );
$oTravel->setSlug( $oSeoUrl->create( $o->nodeValue ) );
break;
case 'youtube_video_key':
// if( null === ( $oYoutube = $oObjectManager->getRepository( '\Application\Entity\Youtube' )->findOneBy( array( 'video' => $o->nodeValue ) ) ) )
// {
// $oYoutube = new Youtube();
// $oYoutube->setVideo( $o->nodeValue );
// }
break;
}
}
}
if( $oXmlReader->nodeType == \XMLReader::END_ELEMENT && $oXmlReader->name == self::GROUP_ELEMENT_NAME )
{
$oTravel->setStatus( self::ACTIVE );
$oObjectManager->persist( $oTravel );
$oObjectManager->flush();
$oObjectManager->clear();
}
}
}
}
}
}
return new ViewModel();
}
?>
de foutmelding die hij bij mij geeft slaat op de koppeltabel
Toevoeging op 19/05/2014 22:07:24:
EDIT: Toch gelukt.
Toevoeging op 19/05/2014 22:10:48:
entity movie:
Code (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
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
<?php
namespace FrankBeen\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Movie
*
* @ORM\Table(name="movies")
* @ORM\Entity
*/
class Movie
{
/**
* @var string
* @ORM\Id
* @ORM\Column(name="video", type="string", length=64, nullable=false)
*/
private $video;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=64, nullable=false)
*/
private $title;
/**
* @ORM\ManyToMany(targetEntity="Travel", mappedBy="movies")
*/
private $travels;
public function __construct() {
$this->travels = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Set video
*
* @param string $video
* @return Movie
*/
public function setVideo($video)
{
$this->video = $video;
return $this;
}
/**
* Get video
*
* @return string
*/
public function getVideo()
{
return $this->video;
}
/**
* Set title
*
* @param string $title
* @return Movie
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Add travels
*
* @param \FrankBeen\MainBundle\Entity\Travel $travels
* @return Movie
*/
public function addTravel(\FrankBeen\MainBundle\Entity\Travel $travels)
{
$this->travels[] = $travels;
return $this;
}
/**
* Remove travels
*
* @param \FrankBeen\MainBundle\Entity\Travel $travels
*/
public function removeTravel(\FrankBeen\MainBundle\Entity\Travel $travels)
{
$this->travels->removeElement($travels);
}
/**
* Get travels
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTravels()
{
return $this->travels;
}
}
?>
namespace FrankBeen\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Movie
*
* @ORM\Table(name="movies")
* @ORM\Entity
*/
class Movie
{
/**
* @var string
* @ORM\Id
* @ORM\Column(name="video", type="string", length=64, nullable=false)
*/
private $video;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=64, nullable=false)
*/
private $title;
/**
* @ORM\ManyToMany(targetEntity="Travel", mappedBy="movies")
*/
private $travels;
public function __construct() {
$this->travels = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Set video
*
* @param string $video
* @return Movie
*/
public function setVideo($video)
{
$this->video = $video;
return $this;
}
/**
* Get video
*
* @return string
*/
public function getVideo()
{
return $this->video;
}
/**
* Set title
*
* @param string $title
* @return Movie
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Add travels
*
* @param \FrankBeen\MainBundle\Entity\Travel $travels
* @return Movie
*/
public function addTravel(\FrankBeen\MainBundle\Entity\Travel $travels)
{
$this->travels[] = $travels;
return $this;
}
/**
* Remove travels
*
* @param \FrankBeen\MainBundle\Entity\Travel $travels
*/
public function removeTravel(\FrankBeen\MainBundle\Entity\Travel $travels)
{
$this->travels->removeElement($travels);
}
/**
* Get travels
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTravels()
{
return $this->travels;
}
}
?>
entity travel:
Code (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
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
<?php
namespace FrankBeen\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Travel
*
* @ORM\Table(name="travels")
* @ORM\Entity
*/
class Travel
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=64, nullable=false)
*/
private $title;
/**
* @ORM\ManyToMany(targetEntity="Movie", inversedBy="travels")
* @ORM\JoinTable(name="travels_movies",
* joinColumns={@ORM\JoinColumn(name="travel_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="video_id", referencedColumnName="video")}
* )
*/
private $movies;
public function __construct() {
$this->movies = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set title
*
* @param string $title
* @return Travel
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Add movies
*
* @param \FrankBeen\MainBundle\Entity\Movie $movies
* @return Travel
*/
public function addMovie(\FrankBeen\MainBundle\Entity\Movie $movies)
{
$this->movies[] = $movies;
return $this;
}
/**
* Remove movies
*
* @param \FrankBeen\MainBundle\Entity\Movie $movies
*/
public function removeMovie(\FrankBeen\MainBundle\Entity\Movie $movies)
{
$this->movies->removeElement($movies);
}
/**
* Get movies
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getMovies()
{
return $this->movies;
}
}
?>
namespace FrankBeen\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Travel
*
* @ORM\Table(name="travels")
* @ORM\Entity
*/
class Travel
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=64, nullable=false)
*/
private $title;
/**
* @ORM\ManyToMany(targetEntity="Movie", inversedBy="travels")
* @ORM\JoinTable(name="travels_movies",
* joinColumns={@ORM\JoinColumn(name="travel_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="video_id", referencedColumnName="video")}
* )
*/
private $movies;
public function __construct() {
$this->movies = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set title
*
* @param string $title
* @return Travel
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Add movies
*
* @param \FrankBeen\MainBundle\Entity\Movie $movies
* @return Travel
*/
public function addMovie(\FrankBeen\MainBundle\Entity\Movie $movies)
{
$this->movies[] = $movies;
return $this;
}
/**
* Remove movies
*
* @param \FrankBeen\MainBundle\Entity\Movie $movies
*/
public function removeMovie(\FrankBeen\MainBundle\Entity\Movie $movies)
{
$this->movies->removeElement($movies);
}
/**
* Get movies
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getMovies()
{
return $this->movies;
}
}
?>
Controller:
Code (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
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
<?php
namespace FrankBeen\MainBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction($name)
{
$video = 'v=g_r4a-DXA7c';
$em = $this->getDoctrine()->getManager();
$movie = $em->getRepository('MainBundle:Movie')->findOneBy(array('video' => $video));
if($movie == NULL)
{
$movie = new \FrankBeen\MainBundle\Entity\Movie();
$movie->setVideo('v=g_r4a-DXA7c');
$movie->setTitle('PHP contactformulier en PHPMailer');
$em->persist($movie);
}
$travel = new \FrankBeen\MainBundle\Entity\Travel();
$travel->setTitle('travel A');
$travel->addMovie($movie);
$em->persist($travel);
$travel2 = new \FrankBeen\MainBundle\Entity\Travel(); // <-- MOEST ECHT EEN NEW Travel() MAKEN!!!!
$travel2->setTitle('travel B');
$travel2->addMovie($movie);
$em->persist($travel2);
$em->flush();
return $this->render('MainBundle:Default:index.html.twig', array('name' => $name));
}
}
?>
namespace FrankBeen\MainBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction($name)
{
$video = 'v=g_r4a-DXA7c';
$em = $this->getDoctrine()->getManager();
$movie = $em->getRepository('MainBundle:Movie')->findOneBy(array('video' => $video));
if($movie == NULL)
{
$movie = new \FrankBeen\MainBundle\Entity\Movie();
$movie->setVideo('v=g_r4a-DXA7c');
$movie->setTitle('PHP contactformulier en PHPMailer');
$em->persist($movie);
}
$travel = new \FrankBeen\MainBundle\Entity\Travel();
$travel->setTitle('travel A');
$travel->addMovie($movie);
$em->persist($travel);
$travel2 = new \FrankBeen\MainBundle\Entity\Travel(); // <-- MOEST ECHT EEN NEW Travel() MAKEN!!!!
$travel2->setTitle('travel B');
$travel2->addMovie($movie);
$em->persist($travel2);
$em->flush();
return $this->render('MainBundle:Default:index.html.twig', array('name' => $name));
}
}
?>
Gewijzigd op 19/05/2014 21:44:08 door Frank Nietbelangrijk