strony www, sklepy internetowe, oprogramowanie

Archiwum kategorii ‘Doctrine2’

Symfony2,Doctrine2- migracje bazy / uaktualnianie bazy

Piątek, listopad 25th, 2011

Robiąc modyfikacje i aktualizacje bazy danych przywykłem do wykorzystywania app/console doctrine:schema:update –force

Jak się okazuje istnieje inne lepsze rozwiązanie tzn zastosowanie migracji:

  • Po zmianie schema i wygenerowaniu nowych entities wykonujemy polecenie app/console doctrine:migrations:diff –env=nasze_env
  • W efekcie zostaje wygenerowany plik migracji w katalogu app/DoctrineMigrations
  • wgranie różnic należy wykonać poprzez polecenie app/console doctrine:migrations:migrate –env=nasze_env

I to wszystko , mam dzięki temu uaktualnioną strukturę tylko ostatnio zmienionej tabeli.

Symfony2 i Doctrine2 – indexy wielokolumnowe

Sobota, lipiec 16th, 2011

W tym krótkim artykule zaprezentujemy jak zdefiniować w symfony2 + doctrine2 indexy wielokolumnowe – zwykłe oraz unikalne.

Sprawa wydaje się być prosta i mogłaby zostać opisana w standardowej dokumentacji symfony2 – tak jednak nie jest i trzeba się troszkę namęczyć żeby takie informacje znaleźć. Skoro my już przez to przeszliśmy, dzielimy się tą wiedzą, abyście Wy już nie musieli na to tracić czasu.

Zatem – załóżmy że mamy Entity o definicji:


/**
* @ORM\Entity
* @ORM\Table(name="SitePage")
*/
class SitePage
{
/**
* @ORM\Id
* @ORM\Column(type="integer", nullable="false")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\ManyToOne(targetEntity="Site", inversedBy="pages")
* @ORM\JoinColumn(name="idSite", referencedColumnName="id", onDelete="CASCADE")
*/
protected $site;
protected $idSite;

/**
* @ORM\Column(type="string",length="255", nullable="false")
*/
protected $name;

/**
*
* @ORM\Column(type="string",length="255", nullable="false")
*/
protected $slug;
}

Zależy nam na tym, aby kolumna slug wraz z kolumną idSite stanowiły index. Rozpatrzymy dwa przypadki:

  1. index zwykły
  2. index unikalny

W obu przypadkach musimy rozszerzyć definicję

@ORM\Table(name="SitePage")

W pierwszym przypadku (zwykły index) będzie to wyglądać w sposób następujący:

@ORM\Table(name="SitePage", indexes={@ORM\Index(name="index_site_page_slug_idx", columns={"idSite","slug"})})

Natomiast w drugim przypadku (index unikalny) będzie to wyglądać tak:

@ORM\Table(name="SitePage", uniqueConstraints={@ORM\Index(name="unique_site_page_slug_idx", columns={"idSite","slug"})})

Po odpowiedniej zmianie standardowo wywołujemy komendy odpowiedzialne za ponowne przegenerowanie Entity oraz update w bazie danych czyli:

php app/console doctrine:generate:entities Namespace

php app/console doctrine:schema:update --force

I to tyle – mam nadzieję, że uda nam się oszczędzić trochę Waszego czasu.

Symfony2 i Doctrine2 relacja OneToOne

Niedziela, czerwiec 26th, 2011

Jak zrobić relację jeden do jednego w Symfony2 i Doctrine2 – sprawa wydaje się banalnie prosta i w rzeczy samej taka jest, ale niestety pominięto to w dokumentacji Symfony2. Przy okazji tego problemu weźmiemy też pod uwagę wykorzystanie Entity z innego Bundle.

Załóżmy więc, że mamy Entity Foo\NaszeBundle\Entity\Tabela1 oraz Foo\IchBundle\Entity\Tabela2

W tabeli Tabela2 chcemy umieścić klucz obcy do tabeli Tabela1. Zatem w definicji Entity Tabela2 umieszczamy następujący kod:

/**
* @ORM\OneToOne(targetEntity=”Foo\NaszeBundle\Entity\Tabela1″)
* @ORM\JoinColumn(name=”idTabela1″, referencedColumnName=”id”)
*/
protected $idTabela1;

Dzięki tak prostej regule w definicji Entity Tabela2 zmienna $idTabela1 stanie się kluczem obcym do Tabela1.