Laravel:多态关系+访问者

时间:2016-05-20 04:31:43

标签: laravel-5 eloquent relationships

我有一个使用多态关系的Gallery表,因此我可以将ImagesVideos添加到我的图库列表中。

Gallery表格中,我有galleryable_type列,其中填充了App\VideoApp\Image

我是否有办法使用访问者(文档here)将galleryable_type的值更改为videoimage,以便我可以使用该列在JS中决定我处理的库项目类型是什么?

我尝试了以下内容:

/**
 * Get and convert the makeable type.
 *
 * @param  string  $value
 * @return string
 */
public function getMakeableTypeAttribute($value)
{
    return str_replace('app\\', '', strtolower($value));
}

但我最终得到以下错误:

FatalErrorException in Model.php line 838:
Class '' not found

我假设在多态关系之前正在处理访问者,但我不确定。

我可以在我的控制器中使用以下内容:

foreach (Gallery::with('galleryable')->get() as &$gallery) {

    $gallery->galleryable_type = str_replace('app\\', '', strtolower($gallery->galleryable_type ));

}

但这似乎是一种狡猾的做事方式。 Laravel大师可以解决解决这个问题的最佳方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的有趣方法。

在您的模型(App\VideoApp\Image)中,您必须添加:

protected $morphClass = 'video';  // 'image' for image class

然后在服务提供者类的register方法中添加:

$aliasLoader = \Illuminate\Foundation\AliasLoader::getInstance();

$aliasLoader->alias('video', \App\Video::class);
$aliasLoader->alias('image', \App\Image::class);

这将导致您在image中将videogalleryable_type写入数据库而不是类名。

现在您可以通过以下方式轻松获得此值:

echo $model->galleryable_type;