Laravel:多态关系 + 访问器

问题描述 投票:0回答:1

我有一个使用多态关系的

Gallery
表,因此我可以将
Images
Videos
添加到我的图库列表中。

Gallery
表中,我有一个
galleryable_type
列,其中填充了
App\Video
App\Image

有没有办法让我使用访问器(文档here)将

galleryable_type
的值更改为
video
image
,这样我就可以使用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 大师能否阐明解决这个问题的最佳方法?

谢谢!

php laravel-5 eloquent relationship
1个回答
0
投票

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

在您的模型(

App\Video
App\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
中写入
video
galleryable_type
而不是类名。

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

echo $model->galleryable_type;
© www.soinside.com 2019 - 2024. All rights reserved.