Невозможно использовать объект типа stdClass в качестве массива, используя laravel - PullRequest
0 голосов
/ 20 мая 2019

enter image description hereenter image description here Я сделал функцию отображения всех своих привилегий в меню
Код моего контроллера ниже:

<?php
    class PrivilegesController extends Controller
    {
        public function getAllPrivileges()
        {
            $privileges  = DB::table('prev_definition')->orderBy('id', 'asc')->get();
            $privileges  = $this->build_heirarchy($privileges);

            $resultArray = ['status' => true, 'message' => 'Privileges found!', 'data' => $privileges];
            return json_encode($resultArray);
        }

        public function build_heirarchy($result_set, $parent_id = 0)
        {
            $rs = array();
            foreach ($result_set as $row) {

                $row['is_checked'] = 1; // here is error
                if ($row['parent_id'] == $parent_id) {

                    $children = $this->build_heirarchy($result_set, $row['id']);
                    if ($children) {

                        if ($children[0]['type'] == 'menu') {

                            $type = 'submenu';
                        } else {
                            $type = 'permission';
                        }
                        $row[$type] = $children;
                    }
                    $rs[] = $row;
                }
            }
            return $rs;
        }
    }
?>

Но я получаю сообщение об ошибке Невозможно использовать объект типа stdClass в качестве массива. Я так запутался, как заставить его работать и работать. Ваша помощь будет высоко оценена!

{
  "data": [
    {
      "created_at": "2019-05-20 15:48:34",
      "deletedAt": null,
      "display_group": "patient",
      "icon": "NULL",
      "id": 297,
      "isDeleted": null,
      "is_checked": 1,
      "parent_id": 0,
      "priv_key": "can_access_patient",
      "priv_title": "Patient",
      "type": "menu",
      "updated_at": "2019-05-20 15:48:34"
    }
  ],
  "message": "Privileges found!",
  "status": true
}


                   class PrivilegesController extends Controller
        {
                  public function getAllPrivileges()
{
              $privileges = DB::table('prev_definition')->orderBy('id', 'asc')->get();
               $privileges = $this->build_heirarchy($privileges);

    $resultArray = ['status' => true, 'message' => 'Privileges found!', 'data' => $privileges];

    return json_encode($resultArray);

}

function build_heirarchy($result_set, $parent_id = 0)
{
    $rs = array();
    foreach ($result_set as $row) {
        $row->is_checked = 1; // here is error
        if ($row->parent_id == $parent_id) {
            $children = $this->build_heirarchy($result_set, $row->id);
            if ($children) {
                if ($children[0]->type == 'menu') {
                    $type = 'submenu';
                } else {
                    $type = 'permission';
                }
                $row->{$type} = $children; // keys to object can only set using curly braces if variable
            }
            $rs[] = $row;
        }
    }
    return $rs;
}

}

Это мой окончательный код контроллера, и я также поделился с вами ответом, вы можете посмотреть его и сообщить мне, если есть какие-либо изменения

Ответы [ 2 ]

1 голос
/ 20 мая 2019

В соответствии с вашими предложениями и комментариями я изменил ваш код, один раз проверьте и дайте мне знать.

class PrivilegesController extends Controller
{
    public function getAllPrivileges()
    {
        $privileges = DB::table('prev_definition')->orderBy('id', 'asc')->get();
        // add below line, keep your old code as it is and check
        $privileges  = json_decode(json_encode($privileges), true);
        $privileges  = $this->build_heirarchy($privileges);
        $resultArray = ['status' => true, 'message' => 'Privileges found!', 'data' => $privileges];
        return json_encode($resultArray);
    }
    public function build_heirarchy($result_set, $parent_id = 0)
    {
        $rs = array();
        foreach ($result_set as $row) {
            $row['is_checked'] = 1; // here is error
            if ($row['parent_id'] == $parent_id) {
                $children = $this->build_heirarchy($result_set, $row['id']);
                if ($children) {
                    if ($children[0]['type'] == 'menu') {
                        $type = 'submenu';
                    } else {
                        $type = 'permission';
                    }
                    $row[$type] = $children;
                }
                $rs[] = $row;
            }
        }
        return $rs;
    }
}

РЕДАКТИРОВАТЬ

  1. Есть только записьс родительским идентификатором 0, поэтому он создаст только одну родительскую запись и рекурсивно добавит дочерние данные.Отметьте this .
  2. Теперь для родительского идентификатора 1 на скриншоте 2 записи, поэтому два элемента будут добавлены внутри самого родительского элемента.
  3. Теперь для родительского идентификатора 2имеет 4 записи на скриншоте, поэтому 4 элемента будут добавлены внутри элемента с идентификатором 2.
  4. Это будет продолжаться внутри каждого элемента с учетом родительского идентификатора.
  5. Впоследствии все данные будут добавленыкаждому родителю этого.Таким образом, индекс только один, а данные рекурсивно добавляются к каждому соответствующему родительскому элементу.

Надеюсь, я ясен.

0 голосов
/ 20 мая 2019
if ($children)
{
    if($children[0]->type=='menu')
        $type = 'submenu';
    else
        $type = 'permission';

    $row[$type] = $children;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...