Laravel 7.x Красноречивые рекурсивные отношения - получить все идентификаторы - PullRequest
0 голосов
/ 06 августа 2020

У меня есть проект, в котором таблица customers ссылается на себя через parent_id. Верхний клиент - это приложение, затем клиенты ниже - это прямые клиенты приложения, а клиенты ниже них - их клиенты.

Мои Customer модельные отношения:

/**
 * Client Parent
 *
 * @return \Illuminate\Database\Eloquent\Relations\belongsTo
 */
public function parent()
{
    return $this->belongsTo(Customer::class, 'parent_id', 'id');
}

/**
 * Client Children
 *
 * @return \Illuminate\Database\Eloquent\Relations\hasMany
 */
public function children()
{
    return $this->hasMany(Customer::class, 'parent_id', 'id');
}

/**
 * Client's All Children
 *
 * @return \Illuminate\Database\Eloquent\Relations\hasMany
 */
public function allChildren()
{
    return $this->children()->with('children');
}

, в моем Controller я получаю все дочерние элементы следующим образом:

 // Get all children customers of the user's customer
 $customerTree = $customer->allChildren;

 $customerIdsInTree = $customerTree->pluck('id')->toArray();

$customerIdsInTree содержит все id для прямых потомков текущего клиента, но не их детей. Я могу видеть потомков как отношения, загруженные для каждого потомка, если я dd($customerTree).

Как мне вырвать все id из дерева, когда клиенты второго уровня находятся в соответствующих отношениях прямого потомка клиента ?

Или иначе, как мне сгладить коллекцию, чтобы родительская и дочерняя строки находились в одной коллекции?

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать курсивную функцию, чтобы получить всех дочерних элементов

    public function allChildren ()
    {
        $children_customers = new Collection();

        foreach ($this->children as $child_customer) {
            $children_customers->push($child_customer);
            $children_customers = $children_customers->merge($child_customer->getAllChildren());
        }

        return $children_customers;
    }

Затем в вашем контроллере вам просто нужно выдернуть ids

 $customerIdsInTree = $customer->getAllChildren()->pluck('id');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...