Symfony2 i Doctrine2 – indexy wielokolumnowe
Sobota, lipiec 16th, 2011W 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:
- index zwykły
- 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.

