Laravel hasMany, где

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

Фотографий таблицы 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 отношения с типом в классах моделей магазинов, квартир и автомобилей.

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

Ответы

Ответ 1

Вы можете использовать Eloquent Полиморфные отношения. Пример в 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 class name (Car/Flat/Shop)

Ответ 2

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

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