我正在运行最新版本的Laravel。 我正在尝试与表建立关系,但我似乎总是遇到某种错误。显示我想要显示的数据但是在所有内容下都有一个很大的错误:
routes.php第26行中的ErrorException: 试图获得非对象的属性
在我的routes.php文件中,这是代码:
Route::get('select', function() {
$users = App\UserInfo::all();
foreach ($users as $u) {
echo $u->userID.' USERNAME: '.$u->userData->username.'<br/>';
echo $u->userOption->dis_joindate.'<br/>'; // Line 26
}
});
第25行似乎可以正常打印没有错误,但下一行会给出对象错误。
这是我的UserInfo Model php文件:
这是我的选项模型php文件:
我的数据库提供的所有内容(在useroptions表中)是id,userID,dis_joindate,dis_location,dis_posts和dis_likes。最后4个专栏只是给出了文字。
这是所有这些运行时页面上输出的图像:
答案 0 :(得分:1)
您的userOption
关系设置不正确。因此,当找不到相关记录时,该关系将(意外地)返回null
,并且当您尝试访问dis_joindate
上的null
时,您将收到此错误对象。
在评论中,您提到您的useroptions
记录的userID
为27,但这不是正在加载的记录。设置关系的方式实际上是在寻找useroptions
为27 {(id
)的userID
条记录。
定义belongsTo
关系时,第二个参数是模型上具有belongsTo
关系的外键字段的名称。在这种情况下,当您指定userID
时,您指定的是userinfo.userID
。第三个参数是要加入的相关模型上的字段的名称。如果未指定,则默认为主键(通常为id
)。由于您尚未指定此参数,因此默认为useroptions.id
。
如果您希望将记录与userinfo.userID = useroptions.userID
相关联,则需要在关系中添加相关字段的名称:
public function userOption() {
return $this->belongsTo('\App\Options', 'userID', 'userID');
}
你没有提到userData表的结构,但你可能也想检查一下。
答案 1 :(得分:1)
这里的问题(假设关系定义得很好)可能是数据。您可能没有每个对象的相关数据。
所以而不是:
foreach ($users as $u) {
echo $u->userID.' USERNAME: '.$u->userData->username.'<br/>';
echo $u->userOption->dis_joindate.'<br/>'; // Line 26
}
你应该使用:
foreach ($users as $u) {
echo $u->userID.' USERNAME: '.(($u->userData) ? $u->userData->username : '-').'<br/>';
echo (($u->userOption) ? $u->userOption->dis_joindate : '-').'<br/>'; // Line 26
}
除了较少的查询数量而不是:
$users = App\UserInfo::all();
你应该像这样使用急切加载:
$users = App\UserInfo::with('userData', 'userOption')->get();
答案 2 :(得分:0)
您在userOptions中遇到关联问题,每个用户至少应有一条记录。 在这种情况下,用户27在表userOptions中没有记录,并且它的值为null,并且您尝试使用null对象的属性