2014-10-17 8 views
17

Mam 3 stoły, samochody, mieszkania i sklepy. Każda tabela ma swoje zdjęcia. Zdjęcia są przechowywane w bazie danych. Chcę używać tylko jednego stołu do zdjęć, nie chcę tworzyć tabeli zdjęć dla każdego samochodu, mieszkania i sklepu.Laravel ma wiele z gdzie

Struktury tablic zdjęć są w ten sposób;

| id |   photo_url  | type | destination_id | 
------------------------------------------------------------ 
    1 | http://example.com/1.jpg | Cars |  1   | 
    2 | http://example.com/2.jpg | Flats |  1   | 
    3 | http://example.com/3.jpg | Flats |  2   | 
    4 | http://example.com/4.jpg | Shops |  1   | 
    5 | http://example.com/3.jpg | Shops |  2   | 

Potrzebuję zdefiniować wiele relacji z typem w klasach modeli sklepów, mieszkań i samochodów.

Jaki jest prawidłowy sposób to zrobić?

Odpowiedz

13

Możesz skorzystać z Eloquent's Polymorphic relationships. Przykład w dokumentacji Laravel faktycznie przedstawia zestawienie wspólnej tablicy obrazów dla wielu modeli, co powinno skierować cię we właściwym kierunku. W twoim przypadku coś się swoimi modelami będzie wyglądać mniej więcej tak:

class Photo extends Eloquent { 

    public function imageable() 
    { 
     return $this->morphTo(); 
    } 

} 

class Car extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

class Flat extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

class Shop extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

I można uzyskać dostęp do zdjęć do, powiedzmy, że dany Flat coś takiego:

Flat::find($id)->photos; 

to zadziałało wy mieliście również trzeba dodać 2 dodatkowe kolumny do photos tabeli:

imageable_id: integer <-- This will be the ID of the model 
imageable_type: string <-- This will be the model's class name (Car/Flat/Shop) 
+2

Spasibo bratan! – fobus

40

Obiekty relacji można traktować jako podobne zapytania, ponieważ można z nimi wywoływać funkcje budowania zapytań. Poniższy przykład powinien skłonić Cię do pójścia we właściwym kierunku.

+0

Dzięki dużo, musiałem zadzwonić 'Order :: z ('orderItems') -> where ('orderItems.type', 1) -> z ('orderItems.o rderItemOptions ',' orderItems.orderMenuItems ') -> first() 'i zakresy nie działałyby w ten sposób – cnlevy