doctrine2

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Medior Front-end Developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als Medior Front-end 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. Onze klantenkring is groot en divers, dat vraagt om flexibiliteit van jou. Tegelijkertijd betekent dit dagelijks nieuwe dingen leren én dat geen werkdag hetzelfde is. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling waarbij iedereen welkom is, zowel

Bekijk vacature »

Software developer (Python)

Functie Je komt te werken in het IT-team bestaande uit de Lead developer en 4 (medior/senior) developers. Gezamenlijk werken jullie aan de verbetering en uitbreiding van de software. Binnen het development team is er veel vrijheid en zelfstandigheid, zonder dat ze hiermee afdoen aan de kwaliteit. Zo hebben ze elke ochtend een korte stand-up (10:00 uur) en houden ze zo nu en dan pair-programming sessies. Ook is er een hele professionele ontwikkelcyclus waarbij code altijd eerst door een collega wordt getest voordat het naar deployement gaat. Je hebt in je werk oog voor kwaliteit, risico’s en het klantbelang. Communicatie met

Bekijk vacature »

Database Developer

Functieomschrijving Heb jij ongeveer 3 jaar ervaring als Database Developer met MS SQL of een vergelijkbare database? Wil jij werken voor een gewaardeerde werkgever in regio Tilburg waar jij de tijd en ruimte krijgt jezelf te ontwikkelen? Lees dan snel verder! Hoe ziet jouw takenpakket eruit? Je houdt je bezig met het creëren en bouwen van MS SQL server databases; Je gaat projecten vanaf het begin tot het eind begeleiden. Je sluit aan bij meetings met klanten om hun processen in kaart te brengen. Vervolgens voer jij het project uit en zorgt dat dit zo goed mogelijk verloopt; Je werkt

Bekijk vacature »

Fullstack Webdeveloper .NET Azure Big Data SaaS

Bedrijfsomschrijving Deze klant van ons is recentelijk onderdeel geworden van een grote moederorganisatie, ze zijn dé partij als het gaat om software maken voor ambitieuze ondernemers, ze maken maatwerk software. Vanuit het fantastisch vormgegeven hightech gebouw te Rotterdam centrum werken ze met zo'n 40 medewerkers aan hoogwaardige software gericht op financiële data, betaalinformatie, maar ook backoffice software. De software wordt webbased, desktop en mobile aangeboden en er worden zeer moderne ontwikkeltechnieken toegepast. Je moet dan denken aan patroonherkenning, Big Data, Machine Learning en OCR. Als Developer, ongeacht je niveau, ga je hier te maken krijgen met de allerleukste kant van

Bekijk vacature »

Gezocht: .Net ontwikkelaars met een maatschappelij

Bedrijfsomschrijving Zoek jij als medior .Net ontwikkelaar een inspirerende werkplek bij een bedrijf met maatschappelijk verantwoordelijkheidsgevoel? Dan is deze vacature je op het lijf geschreven. De organisatie bestaat ruim 20 jaar en ze ontwikkelen in house applicaties waarmee de zorgsector enorm mee gebaat is. Jouw applicaties worden gebruikt door duizenden gebruikers waardoor je echt een waardevolle bijdrage kan leveren aan de maatschappij. Het bedrijf is zeer innovatief en vindt een goede werk/privé balans belangrijk. Je krijgt alle mogelijkheden om jezelf verder te ontwikkelen, je werktijden in te delen en daarnaast is het ook mogelijk om deels thuis te werken. Het

Bekijk vacature »

Software Developer C++ en Perl

Ben je een slimme en enthousiaste universitair opgeleide bèta die graag bij een relatief klein softwarebedrijf wil werken waar de sfeer goed is en eigen inbreng gewaardeerd wordt? Wij, IntelliMagic in Leiden, ontwikkelen technisch hoogwaardige software op het gebied van IT infrastructuur performance analytics. Het type software zorgt voor intellectueel interessante uitdagingen. We ontwerpen de producten zelf en verkopen deze als off-the-shelf software aan grote bedrijven in Europa en de VS. Wij zoeken een ervaren C++ software engineer met kennis van Perl voor een van onze ontwikkelteams. Werkzaamheden Samen met de andere ontwikkelaars specificeren, ontwerpen en implementeren van nieuwe functionaliteit

Bekijk vacature »

Fullstack Software Developer

Bedrijfsomschrijving Functieomschrijving Java ontwerpen, bouwen en testen (T-shaped). Als senior ontwikkelaar ben je bekend in zowel de back-end als de frontend van een applicatie. Angular, Continious Delivery / Integration. Een ervaren iemand die de leiding kan nemen, een weg vindt in nieuwe situaties, en in oude applicaties. Initiatiefrijk, bekend met de (technische) omgevingen die we bij duo gebruiken, niet te beroerd om collega’s te helpen. Als senior programmeur in staat om op te treden als lead programmeur. Ondersteunt de testers bij de testautomatisering en minder ervaren programmeurs bij dagelijks werkzaamheden. Dit laatste met name op het gebied van Angular. Achtergrond

Bekijk vacature »

Junior PHP Developer

Functieomschrijving Junior PHP Developer gezocht! Voor een opdrachtgever in de regio Gelderland zijn wij op zoek naar een Junior PHP Developer die onderdeel gaat worden van het ontwikkelingsteam van deze organisatie. In deze functie ga jij aan de slag met het schrijven van software voor de aansturing van en het managen van windparken en bijbehorende onderdelen. Hiernaast ga jij je bezighouden met het ontwikkelen, testen en onderhouden van diverse webapplicaties. Het team waarin je komt te werken bestaat uit 3 developers, hierdoor krijg je veel verantwoordelijkheid en de kans om jezelf verder te ontwikkelen. Er wordt echter wel van je

Bekijk vacature »

C#.NET developer

Functie Het development team bestaat momenteel uit vijf backend C#/.NET ontwikkelaars. Op dit moment zit één ontwikkelaar dedicated op de mobiele applicatie. Als team werk je samen aan het zelf ontwikkelde software platform. Dit bestaat uit zowel apps als websites. Om het systeem door meer dan honderdduizenden gebruikers wordt gebruikt is het bijna vanzelfsprekend dat de kwaliteit van het product hoog moet liggen. Het systeem bestaat uit drie projecten. Je werkt dus aan deze drie projecten waarbij de focus op z’n tijd verschuift. De technieken die worden toegepast zijn o.a. .NET Core, Xamarin, C# en MVC. Je zal dus met

Bekijk vacature »

Low Code Ontwikkelaar

In het kort Als Low Code Developer werk je aan projecten bij en voor onze klanten, waarbij je voor het ontwikkelen van de oplossingen een technisch low-code platform gebruikt. Samen met het team streef je naar de beste oplossing en bepalen jullie de juiste aanpak. Je rol is divers en je bent van begin tot eind betrokken bij de ontwikkeling zowel de back-end en de front-end van de applicatie. Naast de ontwikkeling en oplevering, breng je ook advies uit aan de klant waarom bepaalde keuzes worden gemaakt. Je bent dan ook communicatief sterk en kunt je keuzes goed (inhoudelijk) onderbouwen.

Bekijk vacature »

SAP ABAP Developer

Dit ga je doen Software ontwikkeling met behulp van o.a. ABAP, Sapscript en Smartforms Maatwerk development op SAP ECC 6.0, in de toekomst S/4 HANA Samenwerken met Business Analisten die functioneel en technisch ontwerpen aanleveren Testen van opgeleverde software Bugfixing Ondersteuning van eindgebruikers Hier ga je werken Onze klant, een internationaal gevestigd productiebedrijf dat mensen blij maakt, is ter versterking op zoek naar een ABAP Developer voor hun SAP team. Het team van 4 mensen verzorgt de ontwikkeling van maatwerk voor de SAP omgeving waar wordt gewerkt met modules SD, FI/CO, PM en MM. Momenteel draait het bedrijf op SAP

Bekijk vacature »

Front-end Developer - React - Data Driven

Bedrijfsomschrijving Onze klant is een snelgroeiende organisatie die een data-driven inspectieapp op de markt hebben gebracht die nu al een aantal jaar door verschillende organisaties wereldwijd gebruikt wordt. Er zijn zo'n 6 mensen werkzaam bij dit bedrijf en ze zijn nu vooral op zoek naar een sterke front-end developer die wil gaan werken aan nieuwbouw applicaties en de uitbouw van de huidige applicaties. De reden dat ze zoeken is omdat er veel werk op komst is en ze hier de juiste capaciteit voor willen hebben. Er heerst hier een hele prettige sfeer waarin respect en eerlijke communicatie belangrijk is. Ook

Bekijk vacature »

Back-end Developer

Functieomschrijving Voor een erkende werkgever in de regio van Middelburg zijn wij op zoek naar een enthousiaste PHP / Symfony Developer. Een ambitieus persoon die het gemotiveerde development team komt versterken met het realiseren van nieuwe en complexe projecten. Ben jij op zoek naar een baan met veel uitdaging binnen een snelgroeiend e-commerce bedrijf, waar je de tijd en ruimte krijgt voor professionele groei? Dit ga je doen: Je bent verantwoordelijk voor de beheer en ontwikkeling van de serviceportal in Symfony en de webshops in de tweede versie van Magento; Je houdt je bezig met het ontwikkelen van nieuwe functionaliteiten;

Bekijk vacature »

Robot Programmeur

Een verantwoordelijke baan met leuke uitdagingen. Heb jij ervaring met het programmeren van robots? Kan jij goed samenwerken met collega's die verschillende specialisaties hebben? Ben je oplossingsgericht, analytisch en flexibel? Ga dan aan de slag als Robot Programmeur bij Gibas in Nijkerk! Als Robot Programmeur kom je te werken bij Gibas. Dat betekent dat je gegarandeerd meewerkt aan unieke oplossingen in productieprocessen. Bij elk project moet er opnieuw geëngineerd en geprogrammeerd worden. Dat maakt jouw werk uitdagend! Voordat je robots gaat programmeren komt er het volgende bij kijken: De opdracht gaat van de afdeling Sales naar de afdeling Operations door

Bekijk vacature »

Software Ontwikkelaar

Functie omschrijving Voor een echt familiebedrijf in de omgeving van 's-Hertogenbosch ben ik op zoek naar een Software Developer. Jij gaat in de functie van Software Developer werken met C# en .NET framework Jij gaat maatwerk software ontwikkelen en softwareoplossingen creëren. Daarnaast optimaliseer je de bestaande software. Oplossingen waar de klant echt iets aan heeft, jij krijgt er energie van op dit te realiseren. Je gaat werken in een Microsoft omgeving(ASP.NET) en gebruikt daarnaast C# en MVC. Samen met het huidige IT team binnen deze organisatie verwerk je de wensen van de klant tot een (eind)product. Bedrijfsprofiel Deze organisatie is

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

27/12/2024 15:09:47
 
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.