Laravel перечисляет все идентификаторы родителей пользователей

Я пытаюсь получить массив всех идентификаторов родителей пользователя, использующего отношение Eloquent. вот отношения

public function parent()
{
    return $this->belongsTo('App\User', 'user_id');
}

и вот метод должен получить мне идентификаторы

public function listParents()
{
    $user = $this;
    $parents = [] ;
    while ($user->parent) {
        $user = $user->parent;
        $parents[] = $user->id;
    };
    return array_reverse($parents);
}

но на лезвии, когда я рендер

{{ $user->listParents() }}

я получаю бесконечный цикл

попробуйте цикл foreach, ваш while ($user->parent) всегда будет правдой.

Quezler 08.05.2018 10:40

спасибо за ответ, я попробовал while ($ user-> parent! = null), но результат тот же!

Adam Ibrahim 08.05.2018 11:26

Я имею в виду, что вы запрашиваете все у родителей пользователей и продолжаете спрашивать их всех, а не одного за другим, пока все они не станут пустыми.

Quezler 08.05.2018 11:29

нет, я прошу всех родителей только одного пользователя $ user-> listParents ()

Adam Ibrahim 08.05.2018 11:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
649
3

Ответы 3

Вы перезаписываете переменную $user в своем цикле while:

while ($user->parent) {
    $user = $user->parent; //  no bueno
    $parents[] = $user->id;
};

Лучше использовать локальную область видимости для запроса родителей:

public function scopeParents($query)
{
    return $query->where('user_id', $this->getKey());
}

$user->parents()->get();

Спасибо за ответ, да, я перезаписываю $ user, чтобы получить родительский элемент родительского элемента до последнего родительского элемента с user_id = 0, я пробовал ваш код, но он не работает, он возвращается только для пользователя, и этот пользователь даже не находится в родителях !

Adam Ibrahim 08.05.2018 11:24

Проблема в том, что $user->parent всегда возвращает true, даже если он пуст.

Вы можете использовать https://secure.php.net/manual/en/function.empty.php, чтобы проверить, содержит ли он больше данных

спасибо за ответ, я попробовал while ($ user-> parent! = null), но результат тот же!

Adam Ibrahim 08.05.2018 11:27

а пока (! empty ($ user-> parent)) тот же бесконечный цикл!

Adam Ibrahim 08.05.2018 11:34

Спасибо всем за ответы, я обнаружил ошибку, у пользователей таблицы базы данных ни у одного из родителей нет user_id = 0, поэтому я получал бесконечный цикл Извини за это вот мой последний метод, который отлично работает (надеюсь, что это может кому-то помочь)

<?php

namespace App;

class User extends Model 
{


    /**
    * the parent of a user
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
    */
    public function parent()
    {
         return $this->belongsTo('App\User', 'user_id');
    }


    /**
    * list parents ids 
    * @return array
    */
    public function listParents()
    {
        $user = $this;
        $parents = collect([]) ;

        while ($user->parent) {
            $user = $user->parent;
            $parents->push($user);
        };

        return array_reverse($parents->pluck('id')->toArray());
    }
}

Другие вопросы по теме