首页 文章

Laravel 5.1 - BelongsTo关系返回null

提问于
浏览
3

\App\User

class User

public function status() {

    return $this->belongsTo('App\UserStatus', 'user_status_id', 'id');
}

\App\UserStatus

class UserStatus

protected $fillable = ['id'];

public function user() {

    return $this->hasMany('App\User', 'user_status_id', 'id');
}

我已经从一个带有一些字段的简单 User::find() 查询中获得了 $user 对象,然后我尝试通过延迟加载 $user->load('status') 方法来访问 status 对象 .

我正在关注文档,但它似乎无用,因为 $user->status 仍然返回null .

public function foo(User $user) {

    $user->load('status');
    $user->status // returns null
}

我究竟做错了什么?

--------- SOLUTION ---------

实际上,对于延迟加载任何关系,外键值需要存储在模型对象中 .

在我的 find 操作中,我没有查询 user_status_id 字段 . 当我将此字段添加到查询中时, $user->status 语句开始返回 UserStatus 模型 .

我不认为这些信息是在Laravel文档上写的,它可能很简单,但我花了一些时间才弄明白 .

2 回答

  • 4

    实际上,对于延迟加载任何关系,外键值需要存储在模型对象中 .

    在我的查找操作中,我没有查询user_status_id字段 . 当我将此字段添加到查询中时,$ user-> status语句开始返回UserStatus模型 .

    我不认为这些信息是在Laravel文档上写的,它可能很简单,但我花了一些时间才弄明白 .

  • 1

    在status()关系中用行替换

    return $this->belongsTo('\App\UserStatus', 'user_status_id');
    

    在user()中与此关系

    return $this->hasMany('\App\User', 'user_status_id');
    

    长话短说在App之前添加''并删除第三个参数,因为它不是多对多的关系 .

    还要确保您实际使用Eloquent,以便在模型上添加

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class MODELNAME extends Model
    

    并分配一个表

    protected $table = 'model_table';
    

相关问题