2016-05-20 17 views
1

多態性関係を使用するGalleryテーブルがありますので、ImagesVideosをギャラリーリストに追加できます。Laravel:多態性の関係+アクセサ

またはApp\Imageのいずれかが入力されたgalleryable_type列があります。

私は私が扱ってるものをギャラリーアイテムタイプを決定するので、私はJSでその列を使用することができますいずれかvideoまたはimageからgalleryable_typeの値を変更するには、アクセサ(ドキュメントhere)を使用するための方法はありますか?

私は次のことを試してみました:

/** 
* 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 

Iが多型の前に処理されていることをアクセサに関係していると仮定しています私は確信していません。

私は単に私のコントローラで次のように使用することができます。

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

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

} 

しかし、それは物事の危険な方法のように思えます。ラーヴェルの教祖がこの問題に取り組む最善の方法を明らかにしたのだろうか?

ありがとうございます!

答えて

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; 
+0

素晴らしい情報に感謝を! –

+0

注:Laravel 5.3では代わりに[morphMap](https://www.laravel.com/docs/5.3/eloquent-relationships#polymorphic-relations)を使用してください。 – tyteen4a03

+0

はい、L5.3ではtrueですが、この回答は現実的なものより前にmorphMapを持っています。私は自分のエントリーを再編集します。 –