Моя рекурсивная функция в laravel не вызывает сама - PullRequest
0 голосов
/ 17 мая 2019

Я пишу рекурсивную функцию для вызова дочерней записи из родительской записи. Кажется, не работает. я получаю эту ошибку; Msgstr "Попытка получить свойство refid для необъекта". Где я понимаю это неправильно. Пожалуйста, есть идеи? ниже приведен код сниппета.

функциональный контроллер

public function DisplayDetail($id)
{
    $displayDetail = DB::table('tblmembers')
        ->where('refid',$id)
        ->get();
    return $this->DisplayDetail($displayDetail->refid);
}

главный контроллер, где вызывается функция

public function dashboard()
{ 

    $profile = DB::table('tblmembers')->where('username',$userid)->first();
    $data['userdetail'] = $this->DisplayDetail($profile->memid); 
    return view('main.userArea',$data);  
}

диск, на котором отображается выбранная запись

@foreach($userdetail as $userd)
    {{ $userd->memid }}
@endforeach

мои данные образца

refid   |   memid
-------------------
12345   |  123456
123456  |  1234567
123456  |  1234568
123456  |  1234569
1234567 |  1234570

из приведенной таблицы; refid: 123456 принесла memid: 1234567,1234568,1234569. затем refid: 1234567 принесла memid: 12345670

я хочу отобразить все мемы после входа в систему как пользователь с мемид 123456

Ответы [ 3 ]

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

Вы делаете одну вещь неправильно в своей функции DisplayDetail.Здесь корректировка в вашей функции

Если вы хотите получить один элемент, то вот правильный код.

public function displayDetail($id)
{
    $displayDetail = DB::table('tblmembers')
                       ->where('refid',$id)
                       ->first();
    if($displayDetail) {
         $displayDetail['userdetail'] = $this->displayDetail($displayDetail->refid);
    }
    return $displayDetail;
}

И панель инструментов будет выглядеть так

public function dashboard()
{ 
    $profile=DB::table('tblmembers')->where('username',$userid)->first();
    $userDetail = $this->DisplayDetail($profile->memid); 
    return view('main.userArea',[
        'userdetail' => $userDetail
    ]);
}

Это правильный код.Попробуйте это и дайте мне знать, если у вас есть другой запрос по этому вопросу.

0 голосов
/ 17 мая 2019

попробуйте эту функцию

    public function DisplayDetail($id,$data=[])
    {

     $displayDetail = DB::table('tblmembers')
            ->where('refid',$id)
            ->get();
    if($displayDetail && isset($displayDetail->refid))// your condition for last child 
    {   
     $data = $this->DisplayDetail($displayDetail->refid,$data);
    }
     $data[] = array('refid' =>$displayDetail->id ,
                     'memid' => $displayDetail->secondid );
    return $data;
    }

я объясню вам позже сначала измените в соответствии с вашими требованиями и запустите

0 голосов
/ 17 мая 2019

Ошибка:

Попытка получить свойство refid для необъекта

происходит, потому что ваш запрос к базе данных использует ->get(), который возвращает Коллекция , а не предмет.Вы не можете получить свойство ->refid в Коллекции, вы можете получить его только от объекта, который находится в коллекции.

Как показывает Лахвиндер Сингх в своем коде, вам нужно использовать ->first(), так каквернет один объект.Я бы предложил использовать ->firstOrFail(), таким образом вы либо вернете объект, который соответствует вашему идентификатору, либо он потерпит неудачу, если не сможет его найти.

Если вы сделаете:

$displayDetail = DB::table('tblmembers')
        ->where('refid',$id)
        ->firstOrFail();

Теперь вы сможете звонить:

$displayDetail->refid

Вы можете использовать это при вызове функции на displayDetail.

...