web-dev-qa-db-fra.com

Laravel hasMany avec où

J'ai 3 tables, des voitures, des appartements et des magasins. Chaque table a ses photos. Les photos sont stockées dans la base de données. Je veux utiliser un seul tableau pour les photos, je ne veux pas créer de tableau de photos pour chaque voiture, appartement et magasin.

La structure des tableaux de photos est comme ça;

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

J'ai besoin de définir la relation hasMany avec le type dans les classes de modèle Shops, Flats et Cars.

Quelle est la bonne façon de procéder?

27
fobus

Vous pouvez utiliser les Eloquent relations polymorphes . L'exemple dans la documentation Laravel présente en fait la configuration d'un tableau d'images commun pour plusieurs modèles, ce qui devrait vous orienter dans la bonne direction. Dans votre cas, quelque chose que vos modèles ressembleraient à ceci:

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

}

Et vous pouvez accéder aux photos pour, disons un Flat donné, comme ceci:

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

Pour que cela fonctionne, vous devez également ajouter 2 colonnes supplémentaires à votre table 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)
14
Bogdan

Vous pouvez traiter les objets relation comme des requêtes, en ce sens que vous pouvez appeler des fonctions de création de requêtes avec elles. L'exemple ci-dessous devrait vous permettre d'aller dans la bonne direction.

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