Laravel 关系返回 null

Posted

技术标签:

【中文标题】Laravel 关系返回 null【英文标题】:Laravel relationship is returning null 【发布时间】:2014-08-21 15:52:03 【问题描述】:

我想创建简单的关系,以便使用User 模型在数据库中查找用户的个人资料信息。

在 User.php 我有:

class User extends Eloquent implements UserInterface, RemindableInterface 
    ...
    public function profile() 
        return $this->hasOne('UserProfile');
    
    ...

在model/UserProfile.php中:

class UserProfile extends Eloquent

    protected $table='user_profile';
    public function user() 
        return $this->belongsTo('User');
    

在数据库中users.user_iduser_profile.user_id1000

我想在控制器中使用此行访问用户配置文件:

public function getIndex()


    $profile = $user->profile;
    dd( $profile );
    die;

dd() 的结果是:

NULL

我的人际关系问题是什么?

【问题讨论】:

数据库中是否存在 user_profile 行? 你的getIndex()从哪里得到它的$user @Unnawut 在 ProfileController 中访问用户配置文件 我假设var_dump($user->user_id) 给你正确的用户ID 对吧?你在profile() 中尝试过$this->hasOne('UserProfile', 'user_id', 'user_id') 吗? 【参考方案1】:

看起来关系没有加载。

或者尝试使用eager-loading加载它们

User::with('user_profile')->get();

或稍后通过延迟加载加载它们:

$user = Auth::user();
$user->load('user_profile');

由于您使用的主键属性不是id,因此您需要指定它(或在您的关系声明中):

protected $primaryKey = 'user_id';

【讨论】:

我认为急切加载与此无关。但是应该设置主键。 了解这一点真是令人沮丧.. laravel 还不够成熟【参考方案2】:

对于您的users 表,您正在使用除id 之外的其他主键,因此在您的User 模型中您应该明确声明protected $primaryKey = 'user_id',您也可以使用它:

// Not tested with same foreign and local key
return $this->hasOne('UserProfile', 'user_id', 'user_id');

但最好保持两个键不同,也许您可​​以将users.user_id 重命名为users.id。如果您将 users.user_id 重命名为 users.id,那么一切都将正常工作,而无需任何更改。

【讨论】:

【参考方案3】:

我遇到了同样的问题,原因是列后面有一个空格,它将用作关系。只需删除它即可解决。可能与您的问题没有直接关系,但我相信这可以节省一些通过搜索引擎访问此页面的人的时间。

【讨论】:

【参考方案4】:

对我来说,正如@zwacky 建议的那样,解决方案是急切加载:

或稍后通过延迟加载加载它们:

>$user = Auth::user();
>$user->load('user_profile');

这将在刚刚创建 user_profile 并且您需要在代码的另一部分中通过 $user 访问 user_profile 时解决问题。 看起来 laravel 不会立即更新父模型。

【讨论】:

以上是关于Laravel 关系返回 null的主要内容,如果未能解决你的问题,请参考以下文章

近期问题解决暂存

为啥 laravel 雄辩的关系返回空数组

Laravel:从关系而不是整个对象返回属性

Laravel 关系返回 null

Laravel 4 belongsToMany 关系返回空

Laravel 从关系表返回记录