2016-05-20 11 views
1

У меня есть таблица Gallery, в которой используются полиморфные отношения, поэтому я могу добавить Images и Videos в список моих галерей.Laravel: Полиморфные отношения + Аксессуар

В таблице Gallery у меня есть столбец galleryable_type, который заполнен либо App\Video, либо App\Image.

Есть ли способ для меня, чтобы использовать аксессор (DOCS 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)); 

} 

Но это похоже на хитроумный способ делать вещи. Может ли Гуру Ларавела пролить свет на лучший способ решить эту проблему?

Спасибо!

ответ

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

Awesome, спасибо за информацию! –

+0

Примечание: в Laravel 5.3 вы должны использовать [morphMap] (https://www.laravel.com/docs/5.3/eloquent-relationships#polymorphic-relations). – tyteen4a03

+0

Да, это правда в L5.3, у нас есть morphMap, однако этот ответ был до реала. Я вернусь к записи. –

Смежные вопросы