从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误

Posted

技术标签:

【中文标题】从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误【英文标题】:Laravel Error on eager loading relations when migrated from 5.1 to 5.3 【发布时间】:2016-09-27 07:15:42 【问题描述】:
User.php 

namespace ESP;

use Illuminate\Auth\Authenticatable; 

use Illuminate\Database\Eloquent\Model; 

use Illuminate\Auth\Passwords\CanResetPassword; 

use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;

use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

use DB;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract 


    use Authenticatable, CanResetPassword;

    protected $table = 'users';

    protected $primaryKey = 'id';

    public function companies()
           return $this->belongsToMany('ESP\Company', 'company_user', 'user_id', 'company_id');
    

   public function scopeUsername($query, $username)

    return $query->where('username', '=', $username);
   



Company.php 

namespace ESP;

use Illuminate\Database\Eloquent\Model; use DB;

class Company extends Model 

    protected $table = 'companies';

    protected $primaryKey = 'id';

    public function users()
        return $this->belongsToMany('ESP\User');
    


LoginController.php

namespace ESP\Http\Controllers\Login;

use ESP\Http\Requests;

use ESP\Http\Controllers\Controller; use ESP\CustomClass\LDAP\adLDAP;

use Illuminate\Http\Request; 

use Illuminate\Support\Facades\Redirect;

use ESP\LoginAttempts; 

use ESP\Helpers\UtilityHelper;

use ESP\User;

use DB; 

use Auth; 

use Session; 

use View; 

use Paginator; 

use DateTime; 

use Input;

class LoginController extends Controller 


    private function _authenticateClient($username, $password)
    
        $g = User::with('companies')
            ->where( 'username', $username )
            ->where( 'password', md5( $password ) )
            ->get();
        dd($g);
    

错误是这样的。

BadMethodCallException in Builder.php line 2405: Call to undefined method Illuminate\Database\Query\Builder::companies()

我什至不能在我的控制器调用中使用本地范围用户名。

这些模型在我的 laravel 5.1 上运行良好。但是我试图将我的代码库迁移到 5.3 并且我遇到了这个问题。

【问题讨论】:

更改(接口和特征)User 模型如下:github.com/laravel/laravel/blob/master/app/User.php 我已经更改了用户模型。我仍然遇到同样的错误 命名空间 ESP;使用 Illuminate\Foundation\Auth\User 作为 Authenticatable;类用户扩展 Authenticatable protected $primaryKey = 'id'; protected $fillable = ['用户名','电子邮件','密码'];受保护的 $guarded = ['id']; protected $hidden = ['password', 'remember_token'];公共函数公司() return $this->belongsToMany('ESP\Company'); public function components() return $this->belongsTo('ESP\Component'); 关系声明在我之前的 5.1 安装中完美运行。但现在声明的所有函数都不起作用。甚至本地范围 【参考方案1】:

你可以查看app/config/auth.php

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\ESP\User::class,
    ]
],

确保您正确注册了用户模型。

【讨论】:

是的。我已经检查过了。模型是 ESP\User::class 因为我的应用程序命名空间别名为 ESP。就模型而言。我还没有使用 AuthProvider 进行身份验证。这只是为了获取我的用户表中是否有任何记录渴望加载相关公司。但仍然抛出完全相同的错误。有什么想法吗? 我尝试创建一个新模型用户并且它有效。看起来默认用户模型受到限制。我无法访问我在默认用户模型中添加的任何自定义方法。

以上是关于从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 使用 with() 方法预先加载关系

急切加载时为 Eloquent 关系别名

Laravel 动态关系 - 在急切加载时访问模型属性

急切加载时,关系后的冒号后跟两个列名有啥作用?

Laravel 5.4急切加载belongsToMany关系null绑定

EF Core 5.0.4 - 从核心 3.1 升级后,通过 Include() 的急切加载不起作用