【问题标题】:Trying to get property of non-object - Laravel 5试图获取非对象的属性 - Laravel 5
【发布时间】:2015-12-04 19:57:52
【问题描述】:

我试图在我的文章中呼应用户的名字,我得到了

ErrorException: 试图获取非对象的属性

我的代码:

模型

1. News

    class News extends Model
    {
      public function postedBy()
      {
         return $this->belongsTo('App\User');
      }
      protected $table = 'news';
      protected $fillable = ['newsContent', 'newsTitle', 'postedBy'];
    }

2. User

    class User extends Model implements AuthenticatableContract,
                                AuthorizableContract,
                                CanResetPasswordContract
    {
        use Authenticatable, Authorizable, CanResetPassword;

        protected $table = 'users';

        protected $fillable = ['name', 'email', 'password'];

        protected $hidden = ['password', 'remember_token'];

    }

架构

users

news

控制器

public function showArticle($slug)
    {
        $article = News::where('slug', $slug)->firstOrFail();
        return view('article', compact('article'));
    }

刀片

{{ $article->postedBy->name }}

当我尝试删除刀片 {{ $article->postedBy }} 中的名称时,它会输出 id,但是当我尝试在那里添加 -> 名称时,它会显示 Trying to get property of non-object but I have a field namein my table and aUser` 模型。我错过了什么吗?

【问题讨论】:

  • 你能print_r($article);吗?
  • @aldrin27 print_r 直接在我的控制器中?好吧,实际上一切正常,我得到了每个领域,但我无法得到关系。它给了我错误
  • 你需要在你的刀片内部 foreach 。
  • @aldrin27 即使我使用 foreach 我仍然遇到同样的错误
  • 你有数据透视表吗?

标签: php laravel object


【解决方案1】:

您的查询返回的是数组还是对象?如果你把它转储出来,你可能会发现它是一个数组,你需要的只是一个数组访问([])而不是对象访问(->)。

【讨论】:

  • 如果我想使用$article->poster-name 而不是$article->poster['name'] 怎么办
  • 只需将其投射到文章模型上的对象即可。例如:$casts = ['poster' => 'object']
【解决方案2】:

我通过使用Jimmy Zoto's 答案并将第二个参数添加到我的belongsTo 使其工作。这里是:

首先,根据 Jimmy Zoto 的建议,我在刀片中的代码 来自

$article->poster->name 

$article->poster['name']

接下来是在我的belongsTo中添加第二个参数, 来自

return $this->belongsTo('App\User');

return $this->belongsTo('App\User', 'user_id');

其中user_id 是我在新闻表中的外键。

【讨论】:

  • 你还应该检查表中是否有isset()的条目
【解决方案3】:

如果您使用或循环(forforeach 等)或关系(one to manymany to many 等),这可能意味着其中一个查询正在返回 null变量或null 关系成员。

例如:在表格中,您可能希望列出users 及其roles

<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
    </tr>
    @foreach ($users as $user)
    <tr>
        <td>{{ $user->name }}</td>
        <td>{{ $user->role->name }}</td>
    </tr>
    @endforeach
</table>

在上述情况,即使有一个用户没有角色,您也可能收到此错误。您应该将{{ $user-&gt;role-&gt;name }} 替换为{{ !empty($user-&gt;role) ? $user-&gt;role-&gt;name:'' }},如下所示:

<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
    </tr>
    @foreach ($users as $user)
    <tr>
        <td>{{ $user->name }}</td>
        <td>{{ !empty($user->role) ? $user->role->name:'' }}</td>
    </tr>
    @endforeach
</table>

编辑: 你可以使用 Laravel 的 optional 方法来避免错误(more information)。例如:

<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
    </tr>
    @foreach ($users as $user)
    <tr>
        <td>{{ $user->name }}</td>
        <td>{{ optional($user->role)->name }}</td>
    </tr>
    @endforeach
</table>

如果你使用的是 PHP 8,你可以使用null safe operator:

<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
    </tr>
    @foreach ($users as $user)
    <tr>
        <td>{{ $user?->name }}</td>
        <td>{{ $user?->role?->name }}</td>
    </tr>
    @endforeach
</table>

【讨论】:

  • 如果我不想在刀片上使用怎么办?有没有更好的方法?
  • 你可以选择数组而不是集合。
  • @AliLashini 您可以使用空合并运算符(需要 PHP 7.0)。 $user-&gt;role-&gt;name ?? 'No Role'。当用户没有角色关系时,它将打印用户的角色名称或“无角色”。和isset($user-&gt;role-&gt;name) ? $user-&gt;role-&gt;name : 'No Role'一样。
【解决方案4】:

我在父类中实现了hasOne 关系,定义了外键和本地键,它返回了一个对象,但子类的列必须作为数组访问。
$parent-&gt;child['column']
有点混乱。

【讨论】:

    【解决方案5】:

    碰巧过了一段时间我们需要运行

     'php artisan passport:install --force 
    

    再次生成密钥,这解决了我的问题,

    【讨论】:

      【解决方案6】:

      我也有这个问题。在相关控制器(例如 UserController)中添加如下代码

      $users = User::all();
      return view('mytemplate.home.homeContent')->with('users',$users);
      

      【讨论】:

        【解决方案7】:

        Laravel optional() Helper 就是来解决这个问题的。 试试这个助手,如果任何键没有值,那么它不会返回错误

        foreach ($sample_arr as $key => $value) {        
              $sample_data[] = array(       
                'client_phone' =>optional($users)->phone        
              );
            }
         print_r($sample_data);
        

        【讨论】:

          【解决方案8】:

          发生这种情况的原因(解释)

          假设我们有 2 个表 userssubscription

          1 位用户有 1 个订阅

          在用户模型中,我们有

          public function subscription()
          {
              return $this->hasOne('App\Subscription','user_id');
          }
          

          我们可以通过以下方式访问订阅详情

          $users = User:all();
          
          foreach($users as $user){
              echo $user->subscription;
          }
          

          如果任何用户没有订阅,这可能是一种情况。 订阅后我们无法进一步使用箭头功能,如下所示

          $user->subscription->abc   [this will not work] 
          $user->subscription['abc']  [this will work]
          

          但如果用户有订阅

          $user->subscription->abc   [this will work] 
          

          注意:尝试设置这样的 if 条件

          if($user->subscription){
           return $user->subscription->abc;
          }
          

          【讨论】:

            【解决方案9】:

            为我工作:

            {{ !empty($user->role) ? $user->role->name:'' }}
            

            【讨论】:

              【解决方案10】:

              在我的情况下,问题出在错误的列命名中:

              在模型 Product 中,我尝试访问 category 关系实例以获取它的名称,但列名和关系具有相同的名称: 类别 而不是:

              category_id - 用于列名

              类别 - 用于关系

              在关系定义中设置键名,如

              public function category():hasOne
              {
                  return $this->hasOne(Category::class,'category');
              }
              

              没有帮助,因为 Laravel 找到名为 category 的属性后就放弃了寻找关系等。

              解决方案是:

              • 更改属性名称(在模型和数据库中)
              • 更改关系名称(例如 productCategory )

              【讨论】:

                【解决方案11】:

                在我的情况下这不是一个错误。但是,当我尝试打开 users.index 时,这发生在我身上,因为在测试时,我从“STUDENTS”表和“USERS”表中删除了一些数据,外键(“student_id”)代表“学生桌。因此,现在当系统尝试访问外键 ('student_id') 为空的 'USERS' 表时,因为该值已从 'STUDENTS' 表中删除。

                在我意识到这一点后检查了几个小时后,我再次在“STUDENTS”表中插入相同的数据,这解决了问题。

                【讨论】:

                  猜你喜欢
                  • 2015-10-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-09-22
                  • 2017-03-20
                  • 2014-03-25
                  • 2015-01-25
                  相关资源
                  最近更新 更多