車、フラット、ショップの3つのテーブルがあります。各テーブルには写真があります。写真はデータベースに保存されます。写真に1つのテーブルのみを使用したいのですが、車、フラット、ショップごとに写真のテーブルを作成したくありません。
写真テーブルの構造は次のとおりです。
| 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 |
Shops、Flats、およびCarsモデルクラスで、typeとhasManyの関係を定義する必要があります。
これを行う正しい方法は何ですか?
Eloquentの 多態的な関係 を利用できます。 Laravelドキュメンテーションの例は、複数のモデルに共通の画像テーブルを設定することを実際に示しているので、正しい方向を向いているはずです。あなたのモデルは次のようになります。
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;
これが機能するには、photos
テーブルに2つの列を追加する必要もあります。
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)
リレーションシップオブジェクトをクエリのようなものとして扱うことができます。その場合、クエリ作成関数を呼び出すことができます。次の例は、正しい方向に進むはずです。
class Cars extends Eloquent
{
function photos()
{
return $this->hasMany('Photo')->where('photos.type', '=', 'Cars');
}
}