Laravel ORM关系在Laravel 5.2上返回null

时间:2016-02-27 18:09:55

标签: 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');
    }

    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上有类似的设置,它运行得很好。

2 个答案:

答案 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。