2017-01-27 4 views
0

У меня есть проект, в котором ряд моделей определяется с помощью Eloquent. Это просто по большей части, но мне трудно понять, как обращаться с новым случаем. Я собираюсь избегать использования laravel/красноречивой терминологии в случае, если я просто затушевываю проблему.Как обработать наследование модели в Laravel?

У меня есть таблица под названием Question с полями id, QuestionTypeID, QuestionStatement.

На основе QuestionTypeID необходимо создать экземпляр другого класса, который может извлекать информацию для дополнительных таблиц или использовать другую бизнес-логику в коде PHP.

Все эти типы вопросов могли бы реализовать общий интерфейс, как:

interface Question { 
    int id; 
    string statement; 
    function ask($params); 
    // + CRUD stuff I suppose 
} 

Как я могу иметь дело с наличием различных моделей Вопрос? Являются ли необычные модели неотъемлемо привязаны к определенной таблице?

У меня есть, например, SQLQuestion (где логика просто выполнила бы хранимую инструкцию SQL, извлеченную из некоторой таблицы поиска и возвратила ответ) и TimeFrameQuestion (логика которой требует вызовов некоторых модулей TimeFrame).

Единственный стол TimeFrameQuestion можно вытащить из общей таблицы Question, так как он не имеет прямого отношения к какой-либо другой таблице.

Можно ли иметь 2 модели и посмотреть на Question таблицы без SQLQuestion коллекции также содержащей все записи, которые имеют TimeFrameQuestion типа и наоборот?

+0

Это немного сложно ответить, не зная о других отношениях, которые вы ожидаете от «Вопроса». В зависимости от того, насколько простым или сложным он является, «QuestionInterface» может быть хорошим подходом, а затем у вас разные модели «Вопрос», каждая из которых имеет свою красноречивую модель, содержащую разную информацию. – Scopey

+0

@Scopey приветствует быстрый ответ. Я попытался ответить на ваш комментарий в редактировании вопроса. – OGHaza

+0

* Являются ли модели Eloquent неотъемлемо привязаны к конкретной таблице? * Нет, это не так, но определяет отношения .. поэтому я никогда не думаю об изменении ['protected $ table'] (https://laravel.com/ docs/5.3/eloquent # define-models) на лету .. и только боковое примечание, в php вы можете динамически добавлять поля в классы. Не говоря уже о тех магических функциях. –

ответ

0

Я понял, что, вероятно, я приближаюсь к проблеме из-за неправильного направления. Вместо того, чтобы каким-то образом наследовать модель, мне, вероятно, понадобилось наследование контроллера.

Я дал мой вопрос модели в handle функцию, которая вызывается с помощью API, эта функция создает новый контроллер на основе QuestionType столбца модели, называет ask функцию и возвращает результат:

class Question extends Model 
{ 
    protected $table = 'Question'; 

    protected $fillable = [ 
     'Statement', 
     'QuestionType' 
    ]; 

    public function handle($parameters) { 
     $class = '\\App\\Modules\\QAndA\\' . $this->QuestionType . 'Controller'; 
     $controller = new $class; 

     return $controller->ask($this->id, $parameters); 
    } 
} 

Эти контроллеры (например, SQLQuestionController, TimeframeQuestionController) все расширяют QuestionController, который определяет различные общие функции, а отдельные контроллеры переопределяют все, что им нужно.