我有两个模型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');
}
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始终为null。 MySQL查询日志显示Laravel能够获取user_type记录。
公司和 userType 关系之间的唯一区别是主键的数据类型。 company.company_id 是数字,而 user_type.user_type_id 是字符串。 我认为它与键的数据类型有关,但是我在Laravel 5.1上有类似的设置,它运行得很好。
答案 0 :(得分:0)
Laravel支持非数字主键,但您需要设置:
public $incrementing = false;
在您的模型类上。 我通过将UserType定义更改为:
来更正了该问题class UserType extends Model {
protected $table = 'user_type';
protected $primaryKey = 'user_type_id';
public $incrementing = false;
}
答案 1 :(得分:0)
我注意到你的关系的第一个问题是你传递给hasOne函数的第一个user_type_id是错误的,因为你有user_type_id作为user_type表的主键。 hasone的第二个参数必须是父表的外键,即用户的外键。因此,如果您在user_type表中有类似user_id的内容,请改用它。
但如果不是这种情况而且用户宁愿属于UserType,那么你必须将hasOne更改为belongsTo。