请考虑以下表格:
staff
id - integer
name - string
products
id - integer
price - integer
photos
id - integer
path - string
imageable_id - integer
imageable_type - string
Laravel默认将模型类的名称存储在imageable_type
列中,例如App\Product
和App\Staff
。如何手动设置类型值?例如product
和staff
。
在Laravel> = 5.1.14上,您应该设置静态Relation::morphMap
属性来定义应用程序的所有变形类。
在boot()
的AppServiceProvider
方法中,添加以下内容:
\Illuminate\Database\Eloquent\Relations\Relation::morphMap([
'product' => 'App\Product ',
'staff' => 'App\Staff ',
]);
如果使用Laravel <5.1.14,则morphMap
功能不存在。但是,您可以在模型上设置morphClass
属性。这将让您设置*_type
字段内使用的值。
class Product extends Model
{
protected $morphClass = 'product';
}
class Staff extends Model
{
protected $morphClass = 'staff';
}
但是,这种方法的问题是,您将无法从变形记录中获取父记录。因此,如果您具有产品或职员模型,则可以很好地获取照片。但是,如果您有照片模型,将无法轻松获得相关的产品或员工记录。 this question and answer描述了该问题及其解决方案。
Laravel中提供的morphMap
功能> = 5.1.14没有此问题。
我不确定为什么要这样做,但是请查看MorphMany()
的方法的签名:https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_morphMany
MorphMany morphMany(string $related, string $name, string $type = null, string $id = null, string $localKey = null)
您可以更改$ type字符串。