从 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() 方法预先加载关系