如何将 Relation::morphMap() 用于不同的类
Posted
技术标签:
【中文标题】如何将 Relation::morphMap() 用于不同的类【英文标题】:How to use Relation::morphMap() for diffrent class 【发布时间】:2016-07-06 03:37:19 【问题描述】:我正在使用 laravel 多态关系。 我为两个目的定义了两个 morphTo 关系。 我的问题是,但是当我定义 Relation::morphMap() 函数数组的键时,我的数组键在一种情况下是相同的,所以我想知道有什么方法可以指定我正在定义特定类的关系。
我的第一个关系....
包.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');
我想设置密钥以与 map_type_id 进行比较,所以我在服务提供商中设置密钥。
Relation::morphMap([
config('evibe.roles.planner') => \Vendor::class,
config('evibe.roles.artist') => \Vendor::class,
config('evibe.roles.venue') => \Venue::class,
], false);
我的第二个 morphTo 关系
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');
装饰.php
public function bookings()
return $this->morphMany(TicketBooking::class,null,'map_type_id','map_id ');
现在我必须在服务提供者中定义 morphTo,因为我没有使用默认模型名称。
所以我在服务提供者中的 morphTo 变成了这个样子。
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);
现在我的问题是键 config('evibe.roles.planner') 和 config('evibe.ticket_type.venues) 具有相同的值 3,所以当两个东西都被关系访问时,它会抛出错误,因为数组有相同的键。
所以我想问有没有其他方法可以为不同的关系定义不同的morphMap。
【问题讨论】:
【参考方案1】:让我们从定义多态关系开始
第一个关系....
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');
第二次关系
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');
并将Relation::morphMap
注册为
Relation::morphMap([
'vendors' => \Vendor::class,
'venues' => \Venue::class,
'decors' => \Decor::class
]);
【讨论】:
以上是关于如何将 Relation::morphMap() 用于不同的类的主要内容,如果未能解决你的问题,请参考以下文章