doctrine2

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Node.js developer looking for a challenging consul

Functie Under the guidance of 3 account managers, one of whom will be your point of contact within your expertise, you will start working for various clients. He or she will help you find a suitable and challenging assignment. Naturally, they will take your situation, experience and (technical) ambitions into account. The assignments last one to two years on average. This allows you to really commit to a project and make an impact as a consultant. Besides the assignment, you will regularly meet your colleagues from the IT department to share knowledge or discuss new trends, for example. Master classes

Bekijk vacature »

C# Developer

Dit ga je doen Je gaat aan de slag in het websites team of portals team waarin je je bezighoudt met concept & design, implementatie en ook een stukje bugfixing en onderhoud; Je werkt met je team volgens de Scrum werkwijze; Zo adviseer je ook de PO & Scrum Master over de technische architectuur, koppelingen en integratie met externe systemen en API’s; Je blijft op de hoogte van de laatste ontwikkelingen en trends op het gebied van C# / .NET en deelt deze kennis binnen de organisatie. Hier ga je werken Onze klant is een internationale organisatie gevestigd in de

Bekijk vacature »

C# .NET Developer

Functie omschrijving Wij zijn op zoek naar een C# .NET Developer voor een leuke opdrachtgever in de omgeving van Hilversum! Voor een leuk bedrijf in de omgeving van Hilversum zijn wij op zoek naar een Back-end developer die klaar is voor een nieuwe uitdaging. Ben jij iemand die graag aan verschillende projecten werkt en het ook leuk vindt om bij klanten op bezoek te gaan? Dan ben jij de perfecte kandidaat! Deze functie is erg divers, je moet dus goed kunnen schakelen. Je komt te werken in een klein team van developers. Binnen het bedrijf hangt er een gemoedelijke informele

Bekijk vacature »

Java Developer

Vacature details Vakgebied: Software/IT Opleiding: Senior Werklocatie: Eindhoven Vacature ID: 12946 Introductie We are looking for a Java Developer! Our client is one of the most innovation companies located within the Netherlands. We provide high quality software in a high-tech and challenging market. Functieomschrijving The department is specialized in creating and developing high quality software for manufacturing automation in a high tech environment. We strive to provide our clients with high quality software and deliver state of the art solutions in a variety of ways. Creating software infrastructure using Java SE / EE Create applications to fine tune manufacturing processes

Bekijk vacature »

Traineeship Full Stack .NET Developer

Dit ga je doen Start op 7 augustus bij de Experis Academy en ontwikkel jezelf tot een gewilde Full Stack .NET Developer. Maar hoe ziet het traineeship eruit en wat kun je verwachten? Periode 1 De eerste 3 maanden volg je fulltime, vanuit huis, een op maat gemaakte training in teamverband. Je leert belangrijke theorie en krijgt kennis van de benodigde vaardigheden en competenties die nodig zijn om de IT-arbeidsmarkt te betreden. Zowel zelfstandig als in teamverband voer je praktijkopdrachten op het gebied van front- en backend development uit. Wat er per week op het programma staat kun je hier

Bekijk vacature »

C# .NET Software Ontwikkelaar

Functie omschrijving Gezocht: Software Developer C# .NET voor een dynamische organisatie! Ben je onlangs afgestudeerd of ben je toe aan de volgende stap in je professionele carrière? Lees dan verder! We zijn momenteel op zoek naar een Software Developer die klaar is voor een nieuwe uitdaging en die onze eindklant in de regio Arnhem kan versterken. In deze functie werk je aan verschillende projecten en bezoek je vaak klanten. Je kunt een rol verwachten met veel uitdaging, diversiteit en verantwoordelijkheid. Bedrijfsprofiel Binnen welke organisatie ga je aan de slag? Je gaat werken bij een organisatie die zich specialiseert in het

Bekijk vacature »

Full stack .NET developer Microsoft 365

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

C# developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als C# Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij dit jaar Microsoft Partner of the Year geworden. Sogetisten staan klaar voor elkaar, hebben lol met elkaar en daarmee behalen we de mooiste resultaten! Werken bij Sogeti

Bekijk vacature »

C#.NET ontwikkelaar

Functie omschrijving Voor een softwarebedrijf in de omgeving van Veghel zijn we op zoek naar een C# developer. Word jij blij van ontwikkelen in C# en .NET? Lees dan snel verder! Jouw werkzaamheden zullen er als volgt uit gaan zien: Op basis van de wensen van de klant ga je samen met je collega's ga je op zoek naar de juiste oplossingen en je gaat dit uitwerken tot een mooi eindproduct. Je bouwt webshops, webapplicaties en websites, dit doe je door middel van ASP.NET, MVC Framework en C#. Je zorgt voor de optimalisering van bestaande software en de automatisering van

Bekijk vacature »

Back-end Developer

Functieomschrijving Heb jij kort geleden jouw HBO ICT diploma in ontvangst mogen nemen? Of ben je toe aan een nieuwe uitdaging? Voor een gewaardeerde werkgever in regio Oosterhout zijn wij op zoek naar een back-end developer. Kennis of ervaring met C# & SQL is een must! Je bent verantwoordelijk voor de beheer en ontwikkeling van de software; Je draagt bij aan de implementatie van aanpassingen, verbeteringen en aanvullingen in de C# based applicaties; Je test de software en ontwikkelt deze door; Je houdt je bezig met het ontwikkelen van nieuwe functionaliteiten; Je brengt de aanpassingssuggesties van klanten in kaart, om

Bekijk vacature »

Typescript Developer / Cloud platform

Dit ga je doen (Door)Ontwikkelen van het cloud platform; (Door)Ontwikkelen van microservices; Bouwen van nieuwe functionaliteiten; Verbeteringen aandragen voor het cloud platform; Sparren met de business. Hier ga je werken Onze opdrachtgever, gevestigd in regio Eindhoven, levert een compleet dienstenpakket op het gebied van IT. Zij pakken verschillende (complexe) vraagstukken van grote organisaties op. De sfeer intern is gezellig en informeel. Men houdt van hard werken maar gezelligheid door middel van een borrel of gezamenlijke lunch komt er veel voor. Als Typescript ontwikkelaar word je onderdeel van het team gericht op de (door)ontwikkeling van hun eigen cloud platform welke wordt

Bekijk vacature »

Back end developer Digital agency

Functie Heb jij altijd al eens bij een bedrijf willen werken waar jij géén nummertje bent, die alleen maar uitvoerend werk doet? Dan zou je hier perfect passen! Tuurlijk, je werkt aan projecten voor grote of kleine bedrijven… Het enige verschil hier is, jouw mening telt hier écht. Jouw inbreng wordt gewaardeerd, serieus genomen en gebruikt. En vergeet niet, je werkt niet alleen aan deze projecten. Er werken in totaal ruim 20 developers en designers, onderverdeeld over 3 development teams. Voornamelijk bestaande uit Medior en Senior developers, die samen voor een inspirerende en ambitieuze omgeving zorgen. Hun visie is namelijk

Bekijk vacature »

C++ Developer

Functieomschrijving Ben jij als software engineer toe aan een nieuwe uitdaging? Dan zijn wij op zoek naar jou! Voor het maken van de procesbesturingsoftware gebruiken onze projectteams een in C++ en C# geschreven tool. Dit is een gedistribueerd object framework wat alle kernfuncties biedt voor een procesautomatisering. Verder zullen jouw werkzaamheden o.a. bestaan uit: Analyseren van vragen en wensen van gebruikers en deze vertalen naar een functioneel ontwerp; Ontwerpen, programmeren en testen van productaanpassingen; Implementeren van nieuwe productreleases in de projectteams; Continu toetsen van het effect van nieuwe releases op andere tools en processen; Inzichtelijk maken van voortgang omtrent softwarewerkzaamheden,

Bekijk vacature »

.NET Developer Shared Driving

Bedrijfsomschrijving Onze klant richt zich op het toegankelijker maken van steden, een fantastisch mooi streven. Hoe ze dat doen? Met eigen ontwikkelde software, waarmee vervoersmiddelen gedeeld kunnen worden. Deze inspirerende werkgever maakt een maatschappelijke impact en dat doen ze nu al zo'n 25 jaar! Het bedrijf is gevestigd in het centrum van Rotterdam en kent ongeveer zo'n 90 medewerkers. Het personeel is lekker gewoon gebleven! Iedereen kleedt zich zoals hij of zij dat zou willen en de sfeer is er erg fijn. Een leuke werkgever om voor te werken, en bovendien zijn er voor jou als Software Developer veel mooie

Bekijk vacature »

Java Developer

Dit ga je doen Als Java Developer ben je verantwoordelijk voor: Het ontwikkelen van nieuwe en bestaande webservices; Het uitbreiden van functionaliteiten binnen de producten- en dienstenportefeuille; Het werken aan gegevensuitwisseling met bijvoorbeeld SOAP; Testen van frameworks met gebruik van UNIT en Selenium. Hier ga je werken De organisatie waar je komt te werken is een semi-overheidsinstelling, gesitueerd in Utrecht en zorgt voor een goede samenwerking tussen verschillende overheidsinstanties. Het is een familiaire club die gaat voor kwaliteit en langdurige relaties. Zo zorgen zij ervoor dat er op grote schaal vertrouwelijke informatie tussen verschillende overheidsinstellingen wordt uitgewisseld. Hun werk zorgt

Bekijk vacature »
Erik Rijk

Erik Rijk

18/05/2014 16:53:35
Quote Anchor link
Ik heb 3 tabellen:

* 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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }

?>


Entiteit: Youtube

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    /**
     * @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
 
PHP hulp

PHP hulp

23/11/2024 16:37:58
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 18:30:28
Quote Anchor link
Als ik het allemaal zo doorlees dan denk ik dat je makkelijker met een bidirectional many-to-many af bent:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
    }


    // ...
}
?>


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
 
Erik Rijk

Erik Rijk

18/05/2014 19:51:19
Quote Anchor link
Oke je uitleg is duidelijk. Heb ik nog een nieuwe vraag:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 20:07:10
Quote Anchor link
Ik zie $oObj die een Youtube entity in zich heeft en ik zie een $oYoutube. Waar komt die laatste vandaan?
 
Erik Rijk

Erik Rijk

18/05/2014 20:09:54
Quote Anchor link
Dat is een instantie van de entiteit:

$oYoutube = new Youtube();
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 20:24:09
Quote Anchor link
Ok je maakt dus een nieuwe entity aan zet de unieke youtube code in die entity en je slaat hem op in de database. Vervolgens Koppel je deze aan de $oTravel entity. Kan het zijn dat je deze dan ook nog eens opslaat met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$oObjectManager
->persist( $oTravel );
$oObjectManager->flush();
?>

???

Volgens mij is dit beter (hoop ik)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

?>
Gewijzigd op 18/05/2014 20:36:27 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/05/2014 20:33:25
Quote Anchor link
Over onlogica gesproken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
findOneBy( array( 'video' => $o->nodeValue );
?>


Sorry te snel.
Gewijzigd op 18/05/2014 20:40:14 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 20:37:20
Quote Anchor link
Ik heb m nog iets aangepast. dus nog een keer proberen aub?
 
Wouter J

Wouter J

18/05/2014 20:44:04
Quote Anchor link
Hmm, de logica van het script is volgens mij een beetje kwijt. Of dat komt door vreemde variabele benamingen weet ik niet, maar het helpt er in elk geval wel aan mee :)

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

?>
Gewijzigd op 18/05/2014 20:44:26 door Wouter J
 
Erik Rijk

Erik Rijk

18/05/2014 21:41:04
Quote Anchor link
Komt nu met de melding:

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
}

?>


Toevoeging op 18/05/2014 22:03:13:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$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;
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 22:31:30
Quote Anchor link
De foutmelding is wel duidelijk toch? Duplicate entry '5839-47616' for key 'PRIMARY'
 
Erik Rijk

Erik Rijk

18/05/2014 22:39:34
Quote Anchor link
Mee eens.. Maar ik schiet het record ook niet in om het moment dat ik resultaat krijg op mn findOneBy select.
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'
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2014 22:49:38
Quote Anchor link
Je kunt geen extra records in de koppeltabel invoegen. En als je het wel doet/kunt dan is het geen koppeltabel meer. Je zou er dan een entity van moeten maken.

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
 
Erik Rijk

Erik Rijk

19/05/2014 14:13:55
Quote Anchor link
travel
* 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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
rel_travel_youtube
travel_id    youtube_id
1            1
2            1


Denk ik verkeerd o.i.d.? Ik hoor het graag!
Gewijzigd op 19/05/2014 14:14:28 door Erik Rijk
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/05/2014 17:15:40
Quote Anchor link
Nou leg je het heel helder uit allemaal maar ik mis nog steeds de reden WAAROM je een record wilt maken in de koppeltabel (rel_travel_youtube).

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
 
Erik Rijk

Erik Rijk

19/05/2014 19:01:08
Quote Anchor link
Dat klinkt logisch en dat is ook precies wat ik doe. Maar toch:

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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/05/2014 20:47:39
Quote Anchor link
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
 
Erik Rijk

Erik Rijk

19/05/2014 21:24:37
Quote Anchor link
Dit heb ik nu. Klein deel in commentaar.. Ik krijg het niet voor elkaar :-/ Alle mogelijke situaties hebben zich voorgedaan tijdens mn geknutsel, behalve het geen wat ik graag wil :)

Op basis van het geheel.. Wat raad je aan?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
        }

?>
 
Frank Nietbelangrijk

Frank Nietbelangrijk

19/05/2014 21:43:33
Quote Anchor link
Ik heb de boel eens nagebouwd en inderdaad lijkt het niet te werken icm met video als primary key

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
}

?>

entity travel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
}

?>

Controller:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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));
    }
}

?>
Gewijzigd op 19/05/2014 21:44:08 door Frank Nietbelangrijk
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.