2013-05-14 8 views
6

Mam tabelę Książki: z identyfikatorem (int) i numerem ISBN (ISBN) numer ISBN jest unikalnym kluczem. Mam inny stół, w którym przechowuję isbn do książki. Na modelu książki mam: $ this-> hasMany ("Inne", "isbn", "isbn");Wymowne: użyj innej kolumny jako klucza podstawowego dla relacji

Ale to ignoruje isbn. Czy znasz jakiś sposób na zrobienie tego?

Temporary Fix:

$this->primaryKey = 'isbn'; 
return $this->hasMany('Other', 'isbn'); 
+0

Odpowiedź jest krótka - nie można. Jednak może istnieć rozwiązanie. Czy mógłbyś wyjaśnić swój schemat? Dlaczego nie możesz mieć 'book_id' jako swojego fk? –

+0

To była istniejąca baza danych i była całkiem zła (nie był to jedyny problem). –

Odpowiedz

1

Nie jest to możliwe - istnieją tylko kilka przypadków, gdzie chcesz połączyć się unikalnym kolumny w tabeli, która nie jest również pk. To powiedziawszy, inne frameworki opracowały metody zmiany klucza głównego i nikt nie formalnie zażądał go od Laravel. Możesz write up a proposal on GitHub i może to być w przyszłej wersji.


Patrząc na konkretnym przykładzie na chwilę - może to mieć nieoczekiwane wyniki, gdy przyjdziesz do korzystania z relacji w sytuacjach chętnie ładowania, i to stanowi jedynie po jednej stronie relacji. Po dodaniu belongsTo na Innym będziesz miał odwrotny problem.

Może być możliwe ustawienie związku przez isbn; jednak przyjąłby on formę Book hasOne ISBN, ISBN należy do Book, ISBN ma Many Other, Other belongsTo ISBN; a dostęp do właściwości będzie wyglądał tak: $book->isbn->others lub $other->isbn->book.

Moja ostatnia sugestia to rozszerzenie książki i ustawienie klucza podstawowego nowej klasy jako isbn i oparcie wszystkich relacji na tym modelu. To nie jest idealne, ale byłoby mniej bolesne niż inne rozwiązania.

1

Natknęliśmy się na ten sam problem ostatnio, nie jestem jeszcze pewien, czy to będzie działać, ale jako idea:

class Book { 
    public function isbn() { 
     // instead of hasMany 
     return ISBN::where('isbn', $this->isbn); 
    } 
} 
+0

Sądzę, że w końcu przegapiłeś metodę "-> get()". Czy mam rację ? – frenus

1

Jeśli czytam tego prawa, może być w stanie to osiągnąć przez przesłanianie getKeyName.

public function getKeyName(){ 
     return $yourKeyName; 
    } 
+0

A jeśli potrzebujesz innej relacji w modelu? – frenus

+0

Wierzę, że to po prostu ustanawia niekonwencjonalną nazwę klucza podstawowego. – adam

0

Od co najmniej 4,2 można teraz określić klucz lokalny w hasMany.

Z dokumentacji (4.2, 5.2):

return $this->hasMany('Comment', 'foreign_key', 'local_key');