【问题标题】:Laravel model inheritance - how to call a function from parent model?Laravel 模型继承 - 如何从父模型调用函数?
【发布时间】:2016-05-27 22:36:34
【问题描述】:

在我的 Laravel 5.2 应用程序中,有以下模型层次结构:

//Model.php:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
abstract class MyModel extends Model {
    public function getAllColumnsNames() {
        ...
    }

//Article.php
namespace App\Models;
class Article extends MyModel {
    ...
}

然后在控制器中,有一个以$item为参数的函数,$item的类型是App\Models\Article:

//MyController.php
use App\Models\MyModel;
...
    public function japi ($item) {
        if (! $item instanceof MyModel) {
            return [];
        } else {
            $columns = $item->getAllColumnNames();
        }
    }

最后一行抛出异常:

Call to undefined method Illuminate\Database\Query\Builder::getAllColumnNames()

我以为这个函数会继承自 MyModel 类,但实际上它是从 Builder 类调用的。

如何从控制器中的 MyModel 调用函数?

[编辑] 实际上,即使我将 getAllColumnNames() 函数从 MyModel 直接移动到 Articles 类,也会引发相同的异常。我被卡住了。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您的方法名称有误。您将方法定义为getAllColumnsNames,当您尝试访问它时,您调用getAllColumnNames(注意Column 是单数)。应该是:

    $columns = $item->getAllColumnsNames();
    

    Laravel Eloquent 模型使用 __call 魔术方法将任何未定义的方法委托给查询构建器。这就是为什么即使find 方法是由Illuminate\Database\Eloquent\Builder 类而不是模型定义的,你也可以使用Article::find(1);,这就是为什么你会得到Builder 类而不是Article 类的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      相关资源
      最近更新 更多