Можно ли хранить название класса сущности в БД (Laravel)

139
02 октября 2021, 13:00

Есть сущность Video. Хочу разделить на FileVideo, YoutubeVideo и ещё несколько. Чтобы у каждой сущности была своя реализация getUrl() и getPreview(), но хранились все в одной таблице.

Можно ли это сделать стандартными инструментами Laravel? Чтобы можно было написать Video::all() и сразу получить коллекцию из сущностей с разными классами. Как вариант, хранить название сущности в отдельном столбце в БД.

Читаю документацию по 6-ой версии и нигде не вижу ничего подобного.

Answer 1

Нашёл ответ. Нужно переопределить методы newInstance и newFromBuilder, получилось следующее:

public function newInstance($attributes = [], $exists = false, $class = null)
{
    if(!$class)
        $model = new static((array) $attributes);
    else
        $model = new $class((array) $attributes);
    $model->exists = $exists;
    $model->setConnection(
        $this->getConnectionName()
    );
    $model->setTable($this->getTable());
    return $model;
}
public function newFromBuilder($attributes = [], $connection = null)
{
    if(empty($attributes->type))
        throw new Exception('Видео должно иметь атрибут type.');
    if($attributes->type === 'file')
        $class = FileVideo::class;
    elseif($attributes->type === 'youtube')
        $class = YoutubeVideo::class;
    else
        throw new Exception('Некорректный тип видео: ' . $attributes->type);
    $model = $this->newInstance([], true, $class);
    $model->setRawAttributes((array) $attributes, true);
    $model->setConnection($connection ?: $this->getConnectionName());
    $model->fireModelEvent('retrieved', false);
    return $model;
}
READ ALSO
Java как сделать файл запускаемым

Java как сделать файл запускаемым

У меня есть код на Java, я могу превратить его в exe но как я понял это плохоКак сделать так чтобы я мог запускать его без команды, как обычное приложение

125
Как закодировать большой массив байтов в base64 без Out of memory в Java?

Как закодировать большой массив байтов в base64 без Out of memory в Java?

На вход приходит byte[] fileData, надо получить на выходе закодированный String

164
Ошибка в IDE "cannot resolve a symbol"

Ошибка в IDE "cannot resolve a symbol"

Всем привет , писал код и вдруг IDE начала выдавать ошибку "cannot resolve a symbol"Помогите пожалуйста решить проблему

264