2014-10-17 2 views
17

У меня есть 3 стола, автомобили, квартиры и магазины. Каждая таблица имеет свои фотографии. Фотографии хранятся в базе данных. Я хочу использовать только одну таблицу для фотографий, я не хочу создавать таблицу фотографий для каждого автомобиля, квартир и магазинов.Laravel hasMany с где

Фотографические таблицы structe - это так;

| 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   | 

Мне нужно определить hasMany отношения с типом в классах моделей магазинов, квартир и автомобилей.

Каков правильный способ сделать это?

ответ

13

Вы можете использовать Eloquent's Polymorphic relationships. Пример в Laravel Documentation фактически демонстрирует настройку общей таблицы изображений для нескольких моделей, поэтому она должна указывать вас в правильном направлении. В вашем случае что-то ваши модели будут выглядеть примерно так:

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'); 
    } 

} 

И вы могли бы получить доступ к фотографиям для, скажем, данного Flat, как это:

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

Для этого, чтобы работать, вы бы Кроме того, необходимо добавить 2 дополнительных столбцов в вашей photos таблице:

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

Вы можете обрабатывать похожие объекты типа похожих запросов, в которых вы можете вызвать с ними функции построения запросов. Пример ниже должен помочь вам двигаться в правильном направлении.

class Cars extends Eloquent 
{ 
    function photos() 
    { 
     return $this->hasMany('Photo')->where('photos.type', '=', 'Cars'); 
    } 
} 
+0

Спасибо большое, мне нужно позвонить 'Order :: с ('ТоварыЗаказа') -> где ('orderItems.type', 1) -> с ('orderItems.o rderItemOptions ',' orderItems.orderMenuItems ') -> first() ', и области не будут работать таким образом – cnlevy

Смежные вопросы