У меня есть таблица пользователей, основная структура которой выглядит так:
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();
Но не знаю, как это сделать во вложенных отношениях.
Есть ли способ добиться этого?






Попробуй это:
User::whereHas('children', function($query) {
$query->whereDoesntHave('children');
})->get();
Короче, но немного парадоксально:
User::doesntHave('children.children')->get();
Журнал запросов, часть 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]
Журнал запросов, часть 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]
Какая у вас версия Laravel?
Попробуйте второй запрос из моего ответа.
спасибо за ответ, но по какой-то странной причине, где DoesntHave не работает. он по-прежнему возвращает тот же результат, когда мой запрос - User :: whereHas ('children') -> get (); Более того, даже в журнале запросов, где DoesntHave не выполняется.