【问题标题】:Call to undefined method after creating new model (Laravel 4.2)创建新模型后调用未定义的方法(Laravel 4.2)
【发布时间】:2015-12-07 10:26:17
【问题描述】:

我刚刚建立了一个新模型,我正在尝试调用我从新控制器内部编写的自定义写入静态方法来匹配模型:

<?php

class NewModelWebController extends AjaxController {

    public function newModelView() {
        $loggedUser = Auth::user();
        $data['user'] = $loggedUser;
        $data['allDetails'] = NewModel::getFullWithDetails($loggedUser->user_id);

        return View::make('webApp::new-model.view', $data);
    }

}

这里是模型类内部的方法定义(php声明前没有空格):

<?php

class NewModel extends Eloquent {

   protected $table = 'new_models';
   protected $primaryKey = 'new_model_id';

   public static function getFullWithDetails($userId) { 
       return 1; // doesn't matter what I return -- the problem still happens
   }

}

返回的错误如下:

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

当我拨打NewModel::find(1); 之类的电话时,它可以正常工作,但是一旦我尝试对我编写的方法进行调用,它就不起作用了。

我尝试了以下所有命令,但均未成功:

  • composer update
  • composer dump-autoload
  • composer clear-cache
  • chown -R www-data:www-data ./theProjectFile

感谢您的想法。

【问题讨论】:

  • 如何在模型中调用函数?
  • 您尝试调用静态方法的NewModeluse 语句是什么样的?
  • 我已经更新了问题,但是对方法的调用发生在控制器类内部。就像我之前说的,NewModel::find(1) 在该控制器中调用时会起作用,但我的自定义方法不起作用。至于use 语句,在调用它的控制器类中没有这样的语句。我能想到的唯一一件事是,如果在继承/包含链层次结构的进一步向上存在某种use 语句,我无法从我正在调用的控制器中看到。但我也没有在其他类似的控制器中看到任何useinclude 语句。 @菲尔
  • 我不知道 Laravel,但我猜我会说它将 Builder 类注册为模型符号。我会尝试使用完整的类名,例如\Namespace\Path\To\NewModel::getFullWithDetails()。不过在那之后你很有可能会遇到其他问题。
  • @phil 我绝对同意这种说法,但我不确定它在这种情况下的适用性如何。 Composer 确实在自动加载文件中映射了类,因此问题似乎不存在。不过,这很奇怪,因为我可以很好地调用其他模型。只是这个新模型给我带来了问题,所以很明显它没有被包含在某个地方。

标签: php laravel laravel-4 eloquent


【解决方案1】:

尝试使用范围而不是实际的静态方法。

class NewModel extends Eloquent {

    public function scopeGetFullWithDetails($userId)
    {
        //
    }
}

调用是一样的。 NewModel::getFullWithDetails(1);

【讨论】:

  • 这个我也试过了,还是不行。此外,我应该能够同时拥有和调用静态和非静态函数。但我也做不到,只要它们是我写的。
  • @Max 您的调用可能正在引用另一个类。您确定没有别名或任何其他名为 NewModel 的类吗?问题不在您的模型中。
  • 我在 Github 中搜索了那个新型号名称,但没有任何结果,因此似乎没有任何名称冲突。我还回滚了迁移,清除了缓存并重新运行,以确保它不是数据库问题。同样的错误仍然出现:(
  • 您的模型究竟扩展了什么?确保在您的config/app.php 中,在alias 数组下,Eloquent 指向Illuminate\Database\Eloquent\Model。您也可以发布完整的NewModel.php 文件吗?
  • app.php 很好,并且正确指向 Eloquent。就像我之前说的,我可以在整个应用程序中引用其他模型没问题;只是新的让我感到悲伤。我已经更新了问题以准确显示控制器和模型中的内容。谢谢你:)
【解决方案2】:

我最终不得不从头开始重新创建模型。当我最初创建它时,文件编码或文件类型肯定有问题,因为最初我只是复制了另一个模型类,然后更改了里面的值。创建一个全新的文件,然后将 PHP 内容粘贴回去解决了这个问题!感谢您的帮助!

【讨论】:

  • 就像添加的信息一样,Laravel 5 似乎在 Artisan CLI 中支持在命令行上创建模型。不幸的是,我们仍然坚持 4 我们必须手动完成!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2013-09-13
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多