2017-01-27 1 views
1

У меня есть таблица вроде этого:Laravel: MYSQL проверить, если ребенок принадлежит к началу родительского уровня с одним запросом

id | user | parent_id | level | 
--------------------------------------------- 
1 | parent1 |  0  |  1 
2 | parent2 |  0  |  1 
3 | parent3 |  1  |  2 
4 | child1 |  1  |  2 
5 | child2 |  4  |  3 

От Child2 Я хотел бы проверить, если он принадлежит к Parent1.

Очевидный ответ будет выполнить запрос из каждого уровня, начиная с Child2> Проверка родителя> проверки родителя> до тех пор, пока Parent1. Но для этого будет много запросов. Нравится:

while ($parent = \DB::table('users')->where('parent_id', $child->parent_id)->first()) { 
    if ($checkparent->id == $parent->id) break; // found the checked parent 
    else $child = $parent; 
} 

Есть ли способ запустить это только одним запросом? (Примечание: это будет более 2-х уровней)

parent1 <-- to here   parent2 
/ \ 
parent3 child1 
      \ 
      child2 <-- from here 
+0

http://dba.stackexchange.com/questions/46393/get-top-most-parent-by-nth-child-id Невозможно выполнить с mysql. Tbh, это микрооптимизация. Поскольку вы уже используете laravel, несколько запросов в базу данных не должны вызывать большого беспокойства. Предполагая, что 'id' является первичным ключом, запросы должны быть быстрыми. –

+0

@AlexBlex: как насчет 500 уровней? – user2002495

+0

Затем пересмотреть модель данных или механизм хранения. Mysql не подходит для цели. –

ответ

-1

Я думаю, что вы ищете это:

Nested has statements may also be constructed using "dot" notation. For example, you may retrieve all posts that have at least one comment and vote: 

// Retrieve all posts that have at least one comment with votes... 
$posts = Post::has('comments.votes')->get(); 

Для получения дополнительной информации ознакомьтесь здесь - https://laravel.com/docs/5.3/eloquent-relationships

Вы должны убедиться, что отношения правильно настроены в моделях.

+0

Это не то, что я ищу. Каждый пользователь является одной и той же моделью. – user2002495