【问题标题】:Laravel trying to get property of non-object in an objectLaravel 试图获取对象中非对象的属性
【发布时间】:2018-02-21 14:42:36
【问题描述】:

简单的代码行不通!我不断收到错误 尝试获取非对象的属性 与 if 语句一致。我尝试像访问数组一样访问它,但收到一条消息说它无法将 stdClass 作为数组访问。

    public function isAllowed($perm)
    {
       $cando = 0;
       $groups = DB::table('group_user')->where('user_id', $this->id)->get();

       foreach ($groups as $mygroup)
       {
          $group_can = DB::table('group_permission')->where([
            ['permission_id', $permission->id],
            ['group_id', $mygroup->group_id]
          ])->first();

          $setting = $group_can->setting; // Error returns for this line // 

          if ($setting > $cando)
          {
            $cando = $setting;
          }
        }
     }

print_r、var_dump 和 $group_ 的 dd 可以给出:

stdClass Object
(
    [group_id] => 1
    [permission_id] => 50
    [setting] => 1
)
object(stdClass)#555 (3) { ["group_id"]=> int(1) ["permission_id"]=> int(50) ["setting"]=> int(1) }
{#555 ▼
  +"group_id": 1
  +"permission_id": 50
  +"setting": 1
}

使用 $setting = $group_can->setting;返回错误尝试获取非对象的属性

使用 $setting = $group_can['setting'];返回错误不能使用 stdClass 类型的对象作为数组

laravel报错详情如下:

在 HandleExceptions->handleError(8, '试图获取非对象的属性', '/home/mwsubmissions/public_html/jon/MWSubmissionManager/app/User.php', 91, array('perm' => 'manage.projects', 'cando' => 1, 'groups' => object(Collection), 'permission' => object(stdClass), 'mygroup' => object(stdClass), 'group' => null, 'group_can' => null, 'setting' => 1))

编辑 我删除了我遇到错误的代码的第一部分,然后得到了这个,另一个相同的例子,但是使用了一个更小的对象,这一行比上一行更重要。已更新所有详细信息。

【问题讨论】:

  • $group = Group::find($mygroup->group_id); 应该是$group = Group::find($mygroup->id);
  • @AnarBayramov 否定。 $mygroup 来自前面提到的 $groups 查询,它是一个只有 2 列的数据透视表,group_id 和 user_id。 $group 对象正在寻找合适的数据,但我无法访问它。
  • 你能在 foreach 中分享return dd($mygroup) 吗?
  • @user2486 我用更详细的内容更新了问题,并在 foreach 中添加了一个 dd。我删除了前一行代码并继续执行下一个更重要的返回相同错误的代码行。
  • 是$permission还是$perm?

标签: php laravel laravel-5


【解决方案1】:

首先,确保将“project_id”添加到组模型中的$fillable 数组
试试这个

public function isAllowed($perm)
{
  $cando = 0;
  $groups = DB::table('group_user')->where('user_id', $this->id)->get();

  foreach ($groups as $mygroup)
  {
      $group = Group::whereId($mygroup->group_id)->first();

      if (!is_null($group->attributes['project_id']))
      {
        continue;
      }
   }
}

【讨论】:

    【解决方案2】:

    你可以检查isset

    public function isAllowed($perm)
        {
           $cando = 0;
           $groups = DB::table('group_user')->where('user_id', $this->id)->get();
    
        if(isset($groups)&&count($groups)>0){
           foreach ($groups as $mygroup)
           {
    
                if(isset($mygroup->group_id)){
              $group = Group::find($mygroup->group_id);
            }
               if (!is_null($group->project_id))
               {
                  continue;
               }
            }
        }
         }
    

    【讨论】:

    • 我可以说你在循环中获取数据可能是任何一行都没有数据。你可以 print_r $group_can) 并发布结果
    • 该信息在原始问题中,但这里又是:stdClass Object ([group_id] => 1 [permission_id] => 50 [setting] => 1)
    • 这是最终的解决方案...在 for 循环中,第一个循环将通过,这就是我的 print_r 工作的原因。但是第二次迭代失败了,当 $group_can 查询未能返回一列时。该死……在这个简单的事情上浪费了 2 个小时。
    • 很高兴这里的回答对您有所帮助。
    【解决方案3】:

    您尝试访问的属性是数组“属性”的一个元素,因此请尝试:

    public function isAllowed($perm)
    {
       $cando = 0;
       $groups = DB::table('group_user')->where('user_id', $this->id)->get();
    
       foreach ($groups as $mygroup)
       {
          $group = Group::find($mygroup->group_id);
    
           if (!is_null($group->attributes['project_id']))
           {
              continue;
           }
        }
     }
    

    希望这会有所帮助:)

    【讨论】:

    • 不。刚刚尝试过并得到相同的尝试在同一行获取非对象错误的属性。
    • 对不起,我刚刚注意到属性数组是受保护的。检查类以查看是否有获取属性的 getter 方法(例如 $group->getAttributes()):)
    • 在这个使用 Laravel 的应用程序中的每个数据库查询中,我都以相同的方式访问了相同的数据。我无法弄清楚为什么这个不同......
    • 很奇怪,如果您从该类之外访问受保护的成员。您可以将对象转换为数组,然后访问受保护的成员,如下所示:stackoverflow.com/a/27754169/3106662
    猜你喜欢
    • 2015-09-22
    • 2017-03-20
    • 2014-03-25
    • 2015-01-25
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多