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_id
和user_profile.user_id
是1000
。
我想在控制器中使用此行访问用户配置文件:
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的主要内容,如果未能解决你的问题,请参考以下文章