Вложенные отношения запроса Laravel в одной таблице

У меня есть таблица пользователей, основная структура которой выглядит так:

id, uname, parent_id  
1   john    null  
2   smith   1  
3   mickey  1  
4   lara    2  
5   tom     3  
6   jessica 4  
7   baneet  4  

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

public function children()
{
    return $this->hasMany('App\Models\User', 'parent_id');
}

public function parents()
{
    return $this->belongsTo('App\Models\User', 'parent_id');
}

Итак, я пытаюсь найти всех пользователей, у которых нет детей. В терминах Lehman: найдите все семьи, у которых есть дети, но у их детей нет детей.

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

User::whereHas('children',function($query){
           // $query;
        })->get();

Но не знаю, как это сделать во вложенных отношениях.

Есть ли способ добиться этого?

Стоит ли изучать 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 и хотите разрабатывать...
0
0
493
1

Ответы 1

Попробуй это:

User::whereHas('children', function($query) {
    $query->whereDoesntHave('children');
})->get();

Короче, но немного парадоксально:

User::doesntHave('children.children')->get();

спасибо за ответ, но по какой-то странной причине, где DoesntHave не работает. он по-прежнему возвращает тот же результат, когда мой запрос - User :: whereHas ('children') -> get (); Более того, даже в журнале запросов, где DoesntHave не выполняется.

Baneet Kumar Sharma 22.05.2018 07:55

Журнал запросов, часть 1: 0 => массив: 3 [▼ "query" => "выберите из users, где существует (выберите из users как laravel_reserved_0, где users.id = laravel_reserved_0.parent_id и laravel_reserved_0 ▶" "привязки" => [] " time "=> 1.8] 1 => array: 3 [▼" query "=>" выберите * из users, где users.parent_id в (?,?,?,?,?,?,?,?,?) и users .deleted_at is null "" bindings "=> array: 9 [▼ 0 => 3 1 => 40 2 => 41 3 => 44 4 => 45 5 => 47 6 => 52 7 => 55 8 => 56] "время" => 0,73]

Baneet Kumar Sharma 22.05.2018 07:57

Журнал запросов, часть 2: 2 => массив: 3 [▼ "query" => "выберите * из users, где users.parent_id в (?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?) и users.deleted_at имеет значение null "" bindings "=> array: 23 [▼ 0 => 40 1 => 41 2 => 42 3 => 43 4 => 44 5 => 45 6 => 46 7 => 47 8 => 48 9 => 49 10 => 50 11 => 51 12 => 52 13 => 53 14 = > 54 15 => 55 16 => 56 17 => 57 18 => 58 19 => 59 20 => 60 21 => 61 22 => 62] «время» => 1,27]

Baneet Kumar Sharma 22.05.2018 07:59

Какая у вас версия Laravel?

Jonas Staudenmeir 22.05.2018 12:00

Попробуйте второй запрос из моего ответа.

Jonas Staudenmeir 22.05.2018 13:46

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