Laravel模型继承 - 如何从父模型调用函数?

时间:2016-02-16 15:13:22

标签: php laravel

在我的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类,也会抛出相同的异常。我被卡住了。

1 个答案:

答案 0 :(得分:1)

方法名称中有拼写错误。您将方法定义为getAllColumnsNames,当您尝试访问该方法时,请拨打getAllColumnNames(请注意Column是单数)。它应该是:

$columns = $item->getAllColumnsNames();

Laravel Eloquent模型使用__call魔术方法将任何未定义的方法委托给查询生成器。这就是为什么即使Article::find(1);方法由Illuminate\Database\Eloquent\Builder类定义而不是模型定义find方法也可以使用Builder的原因,这也是您获取异常的原因Article课程,而不是<div ng-repeat="section in content"> <section block="section"></section> </div> 课程。