• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Symfony 2, Doctrine]Jak zrobić automatyczne tworzenie się rekordów relacji?

Object Storage Arubacloud
0 głosów
422 wizyt
pytanie zadane 6 stycznia 2016 w PHP przez makoso Mądrala (7,380 p.)
edycja 6 stycznia 2016 przez makoso

W pewnym miejscu strony potrzebuję stworzyć playera który rozszerza tworzony jest na podstawie usera, player ma w sobie jeszcze kilka relacji i nie wiem jak to ogarnąć najkrócej, mój jedyny poprawny ale długi sposób to taki:

if( $player === null  ){
            $create = new Player();
            $create->setUser( $user );
            $em->persist( $create );
            $em->flush();

            $resources = new Resources();
            $army = new Army();
            $playerDataInfo = new PlayerDataInfo();
            $builds = new Builds();
            $research = new Research();

            $resources->setPlayer( $create );
            $army->setPlayer( $create );
            $playerDataInfo->setPlayer( $create );
            $builds->setPlayer( $create );
            $research->setPlayer( $create );

            $em->persist( $resources );
            $em->persist( $army );
            $em->persist( $playerDataInfo );
            $em->persist( $builds );
            $em->persist( $research );
            $em->flush();

            $create->setResources( $resources )
                ->setResearch( $research )
                ->setPlayerDataInfo( $playerDataInfo )
                ->setArmy( $army )
                ->setBuilds( $builds );

            $user->setPlayer( $create );
            $em->persist( $create );
            $em->persist( $user );
            $em->flush();
            return $this->redirectToRoute('game_router');
        }

przykład encji playera:

class Player
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\OneToOne(targetEntity="User", mappedBy="player", cascade={"all"})
     */
    protected $user;
    /**
     * @ORM\OneToOne(targetEntity="Resources", mappedBy="player", cascade={"all"})
     */
    protected $resources;
//...

przykład encji builds

class Builds
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="Player", inversedBy="builds")
     * @ORM\JoinColumn(name="player_id", referencedColumnName="id")
     */
    protected $player;

    /**
     * @ORM\Column(type="integer")
     */
    protected $casement = 1;
//....

Relacje:

http://imageshack.com/a/img633/6143/3V65h5.png

1 odpowiedź

0 głosów
odpowiedź 7 stycznia 2016 przez kantekand Obywatel (1,180 p.)

Nie wiem czy dobrze zrozumiałem:

masz klasę User oraz klasę Player, która rozszerza klasę User

player ma w sobie jeszcze kilka relacji - co to oznacza?

czy game_player jest tabelą która ma łączyć Usera z cechą, która sprawia, że staje się on playerem, jeżeli tak to

wtedy masz np. tabele cechy z polami: idcechy | nazwacechy

i w tabeli game_players:

id (to jest klucz obcy tabeli game_users) | idcechy (to jest klucz obcy tabeli cechy)

komentarz 9 stycznia 2016 przez makoso Mądrala (7,380 p.)
Jeżeli dobrze Cię rozumiem, to podajesz mi jaką mam zrobić strukturę, ale mi nie o to chodziło :)
Standardowy przykład :)
Masz tabelę produkt, każdy produkt posiada kategorię, jak zrobić aby przy utworzeniu nowej kategorii powstawał nowy pusty produkt bez nazwy, ceny itp ale posiadał klucz od tej nowej kategorii?
komentarz 9 stycznia 2016 przez kantekand Obywatel (1,180 p.)
przykro mi ale nadal nie wiem co chcesz uzystkać

jeżeli chodzi o przykład, który podałeś to można to zrobić tak:

dodajesz kategorię

$id_add_kat =  mysqli_insert_id (id z ostatniego zapytania)

dodajesz pusty produkt gdzie klucz obcy id_kategorii = $id_add_kat
komentarz 9 stycznia 2016 przez efiku Szeryf (75,160 p.)
edycja 9 stycznia 2016 przez efiku
komentarz 9 stycznia 2016 przez makoso Mądrala (7,380 p.)
edycja 9 stycznia 2016 przez makoso

efik już zaglądam tylko do linków tylko podam to co teraz mi się udało znaleźć, o czym oczywiście nie wiedziałem :) 

$category = $entityManager->getReference('YourProject\Entity\Category', $categoryId);
$product = new Product();
$product->setCategory($category);

i mam pewien zamysł jak to wykorzystać ;)

miałbym do Ciebie jak zwykle kolejne pytanie próbowałem sobie zrobić coś co by mi trochę pomogło i skróciło kod aktualny kod a mianowicie:

a) tablica z zapisanymi nazwami ['resources','army'..itd]i deklarację innej klasy,następnie foreach na pierwszą tablicę i wykonywanie kodu w postaci podobnej do

use aaa/bbb as myentites;

$player = new Player;
$em->persit($player );
$em->flush();

$arr = ['resources','army'/*itd*/];
$myArr = [];


foreach($arr as $entity){
    $myArr[$entity] =  new 'myentities\'.ucfirst($entity);
    $em->persit($myArr[$entity]);
}
$em->flush()

foreach($arr as $entity){
   // tu mam dylemat co może zadziałać eval() czy {}
   $player->{'set'.ucfirst($entity)}($myArr[ucfirst($entity)]);
}
$em->persit($player );
$em->flush();

pisałem teraz z palca więc mogą być błędy i nie wiem czy to w ogóle może działać :)

komentarz 9 stycznia 2016 przez makoso Mądrala (7,380 p.)
Próbowałem z cascade all i dodawało mi rekordy tylko ten nowy rekord nie zawierał id rodzica jeżeli dobrze się wypowiadam, tylko wtedy miałem źle mapowanie zrobione zaraz sprawdzę bo może po zmianach będzie działało jak należy ;)

 

Co do rozszerzeń to nie bardzo wiem jeszcze jak dokładnie działają (po wstępnym przeczytaniu rozszerzenia Tree i jeszcze jednego) zobaczę wszystkie ale pewnie i tak będe to jakim kołem obchodził bo nie zrozumiem zastosowania rozszerzenia -.-
komentarz 10 stycznia 2016 przez makoso Mądrala (7,380 p.)

udało się tak jak pisałem kod wyżej :) parę błędów było :)


            $player = new Player;
            $em->persist($player );
            $em->flush();

            $arr = ['Resources','Army','PlayerDataInfo','Builds','Settings','Research','Skills','Equipment'];

            $myArr = [];
            foreach($arr as $entity){
                $class = 'GameBundle\Entity\User\Player\\'.$entity;
                $myArr[$entity] =  new $class;
                $em->persist($myArr[$entity]);
            }
            $em->flush();
            foreach($arr as $entity){
                $function = 'set'.$entity;
                $player->{$function}($myArr[$entity]);
            }
            $em->persist( $player );
            $user->setPlayer( $player );
            $em->persist( $user );
            $em->flush();

 

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 3 grudnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
0 odpowiedzi 632 wizyt
pytanie zadane 6 kwietnia 2016 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
1 odpowiedź 306 wizyt

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...