Laravel 按名字搜索关系深度

问题描述 投票:0回答:1

我有一个名为 Users 的简单模型,它具有以下架构:

| id | name    | father_id |
|----|---------|-----------|
| 1  | John    | NULL      |
| 2  | Robert  | 1         |
| 3  | Jacob   | 2         |
| 4  | William | 3         |
| 5  | David   | 3         |
| 6  | John    | 4         |
| 7  | William | 5         |
| 8  | John    | 7         |
| 9  | Thomas  | 8         |

我想用全名搜索并显示大概结果..

喜欢搜索:威廉·大卫·雅各布·罗伯特·约翰

从左到右

另一个例子: enter image description here

喜欢搜索:艾哈迈德·苏莱曼·穆罕默德·苏莱曼

艾哈迈德 他的父亲苏莱曼和苏莱曼他的父亲穆罕默德和穆罕默德他的父亲苏莱曼

用户控制器

    public function search(Request $request)
    {
        $q = $request->get('q');
        $users = [];

        if ($q) {
            $users = User::with('father')->where(function ($query) use ($q) {
                $query->where('name', 'like', '%'.$q.'%');
            })
                ->orderBy('name', 'asc')
                ->paginate(24);
        }

        return view('users.search', compact('users'));
    }

用户模型

    public function father()
    {
        return $this->belongsTo(User::class);
    }

我想按名字搜索并通过4个名字或5个名字显示最接近的可能关系 我想用全名搜索并显示大概结果..

php laravel eloquent relationship
1个回答
0
投票

递归关系法

在用户模型中,考虑添加递归关系来获取祖先链。这将有助于检索层次结构。

用户模型(User.php):
public function father()
{
    return $this->belongsTo(User::class, 'father_id');
}

// Recursive relationship to fetch ancestors
public function ancestors()
{
    return $this->father()->with('ancestors');
}

用户控制器(UsersController.php):
public function search(Request $request)
{
    $q = $request->get('q');
    $users = [];

    if ($q) {
        $names = explode(' ', $q); // Split the query into names

        // Initialize the query
        $query = User::with('ancestors');

        // Loop through each name and refine the query
        foreach ($names as $index => $name) {
            $query->whereHas('ancestors', function ($query) use ($name, $index) {
                $query->where('name', 'like', "%$name%")->whereRaw("depth = $index");
            });
        }

        $users = $query->orderBy('name', 'asc')->paginate(24);
    }

    return view('users.search', compact('users'));
}

此方法假定使用

depth
属性或类似逻辑来确定层次结构中祖先的级别,您可能需要实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.