Doctrine2: relaterte nøkler

stemmer
1

Jeg har følgende tabell (type, id, tittel).

Når nye objektet er opprettet og type = 1 id skal være 1, neste objekt med type = 1 id = 2 ... Men når jeg opprette objekt med type = 2 id skal være en.

Hvordan kan jeg gjøre det med Doctrine2 og Symfony2?

Publisert på 14/06/2011 klokken 22:32
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Ved hjelp MAX(id)er ikke en veldig god løsning som det kan føre til noen problemer. Hva skjer hvis du sletter den nyeste posten i gitt kategori og deretter legge en ny? Det vil ha samme ID som tidligere hadde.

  1. Composite primærnøkler ( type, id) er ikke veldig godt håndtert av Lære så langt, så jeg foreslår å lage en klassisk primærnøkkel: integer, auto-tilvekst tasten (i hvert fall for Lære bruk). I tillegg kan du alltid ha en unik indeks på typeog type_idsøyler og bruke den når du vil.
  2. Lag din egen implementering for automatisk økning av type_idkolonne:

    1. Som type_ider assosiert med type du kan lagre ekstra kolonne i typetabellen: next_auto_incrementsom lagrer en verdi som skal brukes til neste post.
    2. Når du oppretter en ny post i tabellen velger du ganske enkelt verdi for det er type_idfra typetabellen:

      $type = ...;
      
      $entity = new Entity();
      $entity->setType($type);
      $entity->setTypeId($type->getNextAutoIncrement()); 
      // btw: typeId is not a very best name
      
      $em->persist($entity);
      
    3. Du trenger også en trigger i databasen for å øke verdien av next_auto_incrementhver gang du setter inn en post (MySQL eksempel):

      DELIMITER $$
      CREATE TRIGGER increment_ai AFTER insert ON entity_table FOR EACH ROW BEGIN
          UPDATE type_table 
          SET next_auto_increment = next_auto_increment + 1 
          WHERE id = NEW.type;
      END$$
      DELIMITER ;
      
Svarte 17/06/2011 kl. 03:08
kilden bruker

stemmer
2

Som andre har sagt, betyr Lære to ikke gjør dette ut av boksen. Det er vanlig praksis å gjøre ID-feltet auto tilvekst og en primærnøkkel i så fall er dette ikke mulig. Primærnøkler må være unikt.

Når det er sagt, kan en løsning være å benytte enheten klarer å finne den maksimale verdi av ID, der den type som er valgt type og å inkrementere den verdi av en.

For eksempel:

// Retrieve the current maximum ID for the selected type
$id = $em->createQuery("SELECT MAX(e.id) AS id FROM Entities\entity e WHERE e.type = ?1")
  ->setParameter(1, $type)
  ->getSingleScalarResult();

// Set your current entity's ID
$entity->setId(++$id);

// Save the entity
...
Svarte 14/06/2011 kl. 23:25
kilden bruker

stemmer
1

Som mine kommentarer ovenfor indikerer, tror jeg ikke det er direkte støtte for hva du prøver å gjøre ut av boksen. Imidlertid tror jeg du bør være i stand til å tilnærme den med klasse bordet arv , hvor hver av typekategoriene er en egen enhet som deler felles data på klasse bordet og holder orden på sin egen indeksering.

Svarte 14/06/2011 kl. 23:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more