如何在Laravel中处理模型继承?

时间:2017-01-27 02:31:25

标签: php laravel eloquent laravel-5.3

我有一个项目,其中使用Eloquent定义了许多模型。这在很大程度上是直截了当的,但我无法理解如何处理新案例。我将避免使用laravel / eloquent术语,以防我模糊问题。

我有一个名为Question的表格,其中包含字段id, QuestionTypeID, QuestionStatement

基于QuestionTypeID,需要实例化不同类别的问题,这可能会为其他表提取信息或在PHP代码中使用不同的业务逻辑。

所有这些问题类型都可以实现一个通用界面,如:

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

如何处理不同的问题模型? Eloquent模型本身并不与特定的表相关联吗?

我有一个SQLQuestion(其中逻辑只执行从某个查找表中提取的存储SQL语句并返回响应)和TimeFrameQuestion(其逻辑需要调用某些TimeFrame模块) )。

可以从一般TimeFrameQuestion表中提取唯一的表Question,因为它与任何其他表没有直接关系。

是否可以让2个模型同时查看Question表,而SQLQuestion集合中还包含TimeFrameQuestion类型的所有记录,反之亦然?

1 个答案:

答案 0 :(得分:1)

我开始意识到我可能从错误的方向接近问题。而不是某种模型继承,我可能需要控制器继承。

我为我的问题模型提供了一个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);
    }
}

这些控制器(例如SQLQuestionControllerTimeframeQuestionController)都扩展了一个QuestionController,它定义了各种共享功能,并且各个控制器会覆盖他们需要的任何内容。