【问题标题】:Laravel trying to get property of non object errorLaravel 试图获取非对象错误的属性
【发布时间】:2017-08-20 11:32:41
【问题描述】:

我正在尝试在 laravel 中创建自己的赞成/反对票系统,但我不断收到此错误。 但是,仅当用户没有对正在显示的帖子之一投票时才会出现此错误,例如,我正在向用户显示所有帖子并使用 getvote($post_id) 函数进行检查。只有当用户没有对其中一个帖子投票时才会出现错误,但是如果他对所有帖子都投票了,那么错误就不会出现。这是我的代码以澄清更多:

public function getVote($post_id) 
{
  $username = Session::get('username');
  if(isset($username)) {
  $uservote = PostVotes::where([
        'post_id' => $post_id,
        'username' => $username,
    ])
    ->first();
    $vote = $uservote->vote;
   if(!$vote)
   {
     return;
   }
   return $vote;  
  } else {
    return null;
  }
}

查看

@foreach ($posts as $post)
  <div class="container">
  <div class="posts">
  <div class="card">
  {{$post->getVote($post_id)}}
      <img class="card-img-top" href="#" src="{{$post->image}}" alt="Card image cap">
      <div class="card-block">
          <h4 class="card-title">{{$post->title}}</h4>
          <div class="vote">
          <i class="fa fa-smile-o fa-fw green" aria-hidden="true" data-value="1" data-id="{{$post->post_id}}"></i>
          <i class="fa fa-frown-o " aria-hidden="true" data-value="-1" data-id="{{$post->post_id}}"> {{$post->score}}</i>
          </div>
          <p class="card-text"><small class="text-muted" id="getDate" data-date="{{$post->created_at}}"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i></small>
            by <a href="profile/{{$post->username}}"> {{$post->username}}</a></p>
      </div>
  </div>
</div>
</div>
@endforeach

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你的错误

    试图获取非对象的属性错误

    发生是因为您的代码没有验证

    $uservote = PostVotes::where([
          'post_id' => $post_id,
          'username' => $username,
      ])->first();
    

    返回一个元素。请记住,如果不匹配任何内容,Eloquent 模型会返回 null。

    在这种情况下,$vote = $uservote-&gt;vote; 将尝试获取 null 的 vote 属性 - 这将引发异常

    相反,使用简单的 if 语句检查 $uservote 是否实际返回一个元素:

    public function getVote($post_id) 
    {
      $username = Session::get('username');
      if(isset($username)) {
      $uservote = PostVotes::where([
            'post_id' => $post_id,
            'username' => $username,
        ])
        ->first();
    
        if ($uservote) {
            $vote = $uservote->vote;
        }
    
       if(!$uservote)
       {
         return;
       }
       return $vote;  
      } else {
        return null;
      }
    }
    

    【讨论】:

    • @flex_ 这是因为 $uservote 没有返回结果。我通过将if(!$vote) 替换为if(!$uservote) 来稍微调整代码来处理这个问题
    • 谢谢你这样做。顺便说一句,我只是想问这是处理投票的好方法还是我应该使用关系?
    • @flex_ 不看你的整个应用程序结构很难回答 - 但这样做没有错。
    猜你喜欢
    • 2016-06-13
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-10-21
    相关资源
    最近更新 更多