How to use Relation::morphMap() for diffrent class

若如初见. 提交于 2020-06-27 16:29:18

问题


I am using laravel polymorphic relation. I have defined two morphTo relations for two purpose. My question is that ,but when I am defining the key of Relation::morphMap() function array , then my array key is same for one case, so I want to know is there any way by which I can specify that I am defining relation for specific class.

My first relation....

Package.php

public function provider()
{
    return $this->morphTo(null, 'map_type_id', 'map_id');
}

Venue.php

public function packages()
{
    return $this->morphMany(VendorPackage::class, 'map', 'map_type_id', 'map_id');
}

Vendor.php

public function packages()
{
    return $this->morphMany(VendorPackage::class, null, 'map_type_id', 'map_id');
}

I want to set the key to compare with map_type_id so I am setting the key in service provider.

Relation::morphMap([
                           config('evibe.roles.planner')        => \Vendor::class,
                           config('evibe.roles.artist')         => \Vendor::class,
                           config('evibe.roles.venue')          => \Venue::class,
                       ], false);

My 2nd morphTo relation

Ticket Booking.php

public function provider()
{
    return $this->morphTo(null, 'map_type_id', 'map_id');
}

Venue.php

public function bookings()
{ 
    return $this->morphMany(TicketBooking::class,null,'map_type_id','map_id');
}

Decors.php

public function bookings()
{
    return $this->morphMany(TicketBooking::class,null,'map_type_id','map_id ');
}

Now again I have to define the morphTo in service provider because I am not using the default Model name.

so my morphTo in service providers became like this.

Relation::morphMap([
                           config('evibe.roles.planner')        => \Vendor::class,
                           config('evibe.roles.artist')         => \Vendor::class,
                           config('evibe.roles.venue')          => \Venue::class,
                           config('evibe.ticket_type.venues')   => \Venue::class,
                           config('evibe.ticket_type.decors')   => \Decor::class
                       ], false);

Now my problem is that key config('evibe.roles.planner') and config('evibe.ticket_type.venues) has the same value 3, so when both things is accessed by the relationship then it is throwing error, because array have same key.

So I want to ask is there any other way to define different morphMap for different relationship.


回答1:


Lets start by defining the polymorphic relations

First relation....

Package.php

public function provider() {
  return $this->morphTo(null,  'map_type_id', 'map_id');
}

Venue.php

public function packages() {
  // you should provide the relation name, in our exemple its called `provider` as a second parameter
  return $this->morphMany(VendorPackage::class, 'provider', 'venues');
}

Vendor.php

public function packages() {
  // you should provide the relation name, in our exemple its called `provider` as a second parameter
  return $this->morphMany(VendorPackage::class, 'provider', 'vendors');
}

Second Relation

TicketBooking.php

public function provider() {
  return $this->morphTo(null, 'map_type_id', 'map_id');
}

Venue.php

public function bookings() { 
  return $this->morphMany(TicketBooking::class, 'provider', 'venues');
}

Decors.php

public function bookings() {
  return $this->morphMany(TicketBooking::class, 'provider', 'decors');
}

and register Relation::morphMap as

Relation::morphMap([
  'vendors' => \Vendor::class,
  'venues' =>  \Venue::class,
  'decors' =>  \Decor::class
]);


来源:https://stackoverflow.com/questions/36100359/how-to-use-relationmorphmap-for-diffrent-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!