2010-05-19 6 views
8

Mam model plików i wiele (obecnie 3) różnych innych modeli (artykuł, zadanie, zdarzenie), które mogą mieć wszystkie pliki, które są przechowywane w modelu plików.Doctrine - Wiele modeli odwołujących się do tego samego pola identyfikatora w innym modelu

Problem polega na tym, że kiedy generowanie tabel za pośrednictwem CLI-Tool (./doctrine build-all-reload), otrzymuję komunikat o błędzie:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot 
add or update a child row: a foreign key constraint fails 
(`my_database/articles`, CONSTRAINT `articles_id_files_target_id` 
FOREIGN KEY (`id`) REFERENCES `files` (`target_id`)) 

Plik jest zdefiniowany jako (Brak relacje są zdefiniowany w tym modelu zdefiniowanego):

columns: 
    id: 
    primary: true 
    autoincrement: true 
    type: integer(4) 
    target_id: integer(4) 
    filename: string(255) 
[...] 

Wszystkie 4 modele tej relacji-definicję:

relations: 
    Files: 
     type: many 
     class: File 
     local: id 
     foreign: target_id 

T jego jest kod PHP, że Doctrine generuje (BaseFile.php):

public function setUp() 
{ 
    parent::setUp(); 
    $this->hasOne('Publication', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Event', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Article', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Job', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 
} 

rozumiem dlaczego tak się dzieje (ograniczeń nie może być skonfigurowany dla wielu tabel), ale nie mają pojęcia, w jaki sposób mogę rozwiązać ten problem problem bez tabel z plikami mutltiple lub tabelą powiązań.

Czy jest jakiś sposób, aby powiedzieć Doctrine, że nie powinno tworzyć relacji w modelu pliku?

Jakieś dobre pomysły?

+0

Czy mogę zapytać, dlaczego nie rozwiązałeś go przy użyciu tabeli powiązań? Jest to bardzo elastyczne i wydajne rozwiązanie, ponieważ umożliwia połączenie tego samego pliku z różnymi typami treści bez przesyłania go wiele razy. Z twoim obecnym modelem jest to niemożliwe ... – wimvds

+0

Czy naprawdę mogę rozwiązać ten problem przy pomocy jednej tabeli powiązań? jak dałbym doktrynie znać pole "typ"? – smoove

+0

Nie wiem, jak to zrobić z doktryną, ale problem prawdopodobnie leży w doktrynie dodającej tabelę, która jest zależna od innej tabeli ** przed ** tą drugą tabelą została utworzona. –

Odpowiedz

0

spróbować, jeśli trzeba,
relacje:

Files: 
    type: many 
    class: File 
    local: target_id 
    foreign: id 
Files2: 
    type: many 
    class: File 
    local: id 
    foreign: id 
0

Można spróbować czegoś takiego:

columns: 
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    target_id: { type: integer(4), notnull: true } 
    model:  { type: string, notnull: true } 

modelu Pliki musi znać identyfikator i model połączonego wpisu. Tak więc, w Files.class.php można również określić:

public function getArticles() { 
    if (strcmp($this->getModel(), 'Articles')) { 
     return Doctrine::getTable('Articles')->findOneById($this->getTargetId()); 
    } else { 
     return false; 
    } 
} 

Prawdopodobnie istnieje lepszy sposób, ale w tym przypadku masz 1 stół, nie trzeba już więcej relacji, ale trzeba określić pobierające/setery samodzielnie. To zależy od twoich celów, czy to będzie świecić, czy nie.

Powiązane problemy