Php Laravel ORM关系在Laravel 5.2上返回null
我有两个模型User和UserType声明如下:Php Laravel ORM关系在Laravel 5.2上返回null,php,mysql,laravel,laravel-5.2,Php,Mysql,Laravel,Laravel 5.2,我有两个模型User和UserType声明如下: class User extends Model { protected $table = 'user'; protected $primaryKey = 'user_id'; public function company() { return $this->hasOne('App\Models\Company', 'company_id', 'company_id'); } p
class User extends Model {
protected $table = 'user';
protected $primaryKey = 'user_id';
public function company() {
return $this->hasOne('App\Models\Company', 'company_id', 'company_id');
}
public function userType() {
return $this->hasOne('App\Models\UserType', 'user_type_id', 'user_type_id');
}
}
class UserType extends Model {
protected $table = 'user_type';
protected $primaryKey = 'user_type_id';
}
现在,我使用以下方法查询关系:
User::with('userType', 'company')->all()
奇怪的是,我得到了公司,但userType总是空的。
MySQL查询日志显示Laravel能够获取用户类型记录
公司和用户类型关系之间的唯一区别是主键的数据类型。company.company\u id是数字,而user\u type.user\u type\u id是字符串。
我认为这与键的数据类型有关,但是,我在Laravel 5.1上有类似的设置,它运行得很好。Laravel支持非数字主键,但您需要设置:
public $incrementing = false;
在你的模型课上。
我通过将UserType定义更改为:
class UserType extends Model {
protected $table = 'user_type';
protected $primaryKey = 'user_type_id';
public $incrementing = false;
}
Laravel支持非数字主键,但您需要设置:
public $incrementing = false;
在你的模型课上。
我通过将UserType定义更改为:
class UserType extends Model {
protected $table = 'user_type';
protected $primaryKey = 'user_type_id';
public $incrementing = false;
}
我注意到的与您的关系有关的第一个问题是,您传递给hasOne函数的第一个user_type_id是错误的,因为您将user_type_id作为user_type表的主键。hasone的第二个参数必须是作为用户的父表的外键。因此,如果在user\u type表中有类似于user\u id的内容,请使用它
但如果情况并非如此,并且user属于UserType,那么您必须将hasOne更改为belongsTo。我注意到您的关系的第一个问题是,您传递给hasOne函数的第一个user\u type\u id是错误的,因为您将user\u type\u id作为user\u type表的主键。hasone的第二个参数必须是作为用户的父表的外键。因此,如果在user\u type表中有类似于user\u id的内容,请使用它
但如果情况并非如此,并且用户属于UserType,则必须将hasOne更改为belongsTo。问题确实是我最初猜测的数据类型。请看我的答案。问题确实是我最初猜测的数据类型。看看我的答案。