【问题标题】:How do I handle model inheritance in Laravel?如何在 Laravel 中处理模型继承?
【发布时间】:2017-06-12 16:17:32
【问题描述】:

我有一个项目,其中使用 Eloquent 定义了许多模型。这在大多数情况下很简单,但我无法理解如何处理新案件。我将避免使用 laravel/eloquent 术语,以防我掩盖了问题。

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

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

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

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

如何处理不同的 Question 模型? Eloquent 模型是否天生就与特定的表相关联?

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

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

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

【问题讨论】:

  • 在不知道Question 的其他关系类型的情况下很难回答。根据它的简单或复杂程度,QuestionInterface 可能是一个好方法,然后您就有不同的Question 模型,每个模型都有自己的雄辩模型,包含不同的信息。
  • @Scopey 为快速响应而欢呼。我已尝试在对问题的编辑中解决您的评论。
  • Eloquent 模型是否天生与特定表相关联? 不,不是,但是,它定义了关系.. 所以我从没想过改变 protected $table on苍蝇..只是一个旁注,在php中你可以动态地将字段添加到类中..更不用说那些神奇的功能了..

标签: php laravel eloquent laravel-5.3


【解决方案1】:

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

我给我的 Question 模型一个 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,该QuestionController 定义了各种共享功能,并且各个控制器覆盖了它们需要的任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2014-07-21
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-03-28
    • 2010-10-24
    相关资源
    最近更新 更多