Eloquent, faire un with avec des données en morph

Par Vincent Pieplu, il y a 4 ans


Bonjour tout le monde. J'aurai une question pour vous.

J'ai plusieurs tables :

books (id;name) 1;carnet 1 book_legends (id;content) 1;ma légende pois (id;name) 1;mon entreprise 2;ma deuxième entreprise book_informations (id;model_type;model_id;book_id;position) 1;App\Models\Poi;1;1 2;App\Models\BookLegend;1;2 2;App\Models\Poi;2;3

Maintenant, je suis dans un Book (1), je récupère les book_informations avec un hasMany.

public function informations(): HasMany { return $this->hasMany(BookInformation::class); }

Mon truc, c'est que je voudrais "with" les datas qui sont dans model_type/model_id. Et c'est là que je bloque.
Auriez-vous des idées ?
Merci

2 réponses

christophe4427, il y a 4 ans

Hello, je comprends rien du tout à la description. Un modèle de données plus clair serait bienvenue je pense.

Après, si la table "book_informations" est donc la table polymorphique, cela veut dire qu'il y à donc des morphTo dans les modèles Book, BookLegend, et Poi. Et que dans le morphable se trouve dans BookInformations.

Après le HasMany fait référence à genre "J'ai plusieurs BookInformation", donc ça veut dire que la relation polymorphique est en ManyToMany ? Ou c'est du BelongToMany ?

ManyToMany : https://laravel.com/docs/8.x/eloquent-relationships#many-to-many-polymorphic-relations
OneToMany : https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-polymorphic-relations

Dans tous les cas pour apporter une réponse éclairée, je pense qu'il faudrait voir les modèles des dits objets. C'est trop flou.

Christophe

popotte, il y a 4 ans

Mmmh pour ça faudrait faire du polymorphic

En gros ca donnerait il truc de ce style

Dans la class Poi et BookLegend:

public function books() { return $this->morphToMany(Book::class, 'book-informations'); }

Et dans la classe Book:

public function pois() { return $this->morphedByMany(Pois::class, 'book-informations'); } public function bookLegends() { return $this->morphedByMany(BookLegend::class, 'book-informations'); }