Laravel 5:尝试通过关系获取非对象错误的属性

时间:2016-02-25 03:26:11

标签: php mysql laravel laravel-5 eloquent

我正在运行最新版本的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文件:

UserInfo.php model

这是我的选项模型php文件:

Options.php model

我的数据库提供的所有内容(在useroptions表中)是id,userID,dis_joindate,dis_location,dis_posts和dis_likes。最后4个专栏只是给出了文字。

这是所有这些运行时页面上输出的图像:

enter image description here

3 个答案:

答案 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对象的属性