In the Laravel documentation, there is the following example for retrieving morphedByMany
relations, which are many-to-many polymorphic relations.
Laravel Many to Many polymorphic relations documentation
namespace App; use Illuminate\Database\Eloquent\Model; class Tag extends Model { /** * Get all of the posts that are assigned this tag. */ public function posts() { return $this->morphedByMany('App\Post', 'taggable'); } /** * Get all of the videos that are assigned this tag. */ public function videos() { return $this->morphedByMany('App\Video', 'taggable'); } }
How would I get a list of all morphed
relations in one query / collection, for instance, posts
and videos
, and then if I later added photos
(or anything), that too?
I use a trick here:
Create a Model Taggable
for your connection table taggable
and add a hasMany
relation to the Tag
model.
public function related() { return $this->hasMany(Taggable::class); }
Within your Taggable
model create a morphedTo
relation.
public function taggables() { return $this->morphTo(); }
Now you can get all models which are using the tag by calling:
$tagged = Tag::with('related.taggables');
Did you think to use the "union" function of the collections to merge all the different collection in order to retrieve all what you need?
class Tag extends Model { [...] /** * Get all of. */ public function morphed() { return $this->video->union($this->posts)->all(); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With