如何在 Laravel 中进行自连接?

How can I do a self-join in Laravel?

这是我的代码:

$role_id = Auth::user()->role_id;

$related = Page::where('path', $request->path())->where('method', $_SERVER["REQUEST_METHOD"])->first()->related;
$pages   = Page::where('related', $related)->get();

foreach ($pages as $page){
    $accessGiven = page_role::where('role_id', $role_id)->where('page_id', $page->id)->first();
    if ( sizeof($accessGiven) > 0 ) {
        return $next($request);
    }
}

return redirect('/');

它在逻辑上运行良好,但对于巨大的数据集来说有点慢。要知道,它实际上是一个中间件,会在大多数请求之前执行。

无论如何,我想我可以将第 2 行和第 3 行组合起来并对其进行一次查询。知道我该怎么做吗?

看这个例子(我没测试):

$requestPath = $request->path();
$serverMethod = $_SERVER["REQUEST_METHOD"];
$pages = Page::where('related', function($query) use($requestPath,$serverMethod) { 
    $query->where('path', $requestPath )->where('method', 
    $serverMethod)->first()->related; }
)->get()

试试这个:

在您的页面模型中:

public function relatedPages(){
    return $this->hasMany(self::class, 'related', 'related');
}

然后

$pages = Page::where('path', $request->path())->where('method', $_SERVER["REQUEST_METHOD"])->first()->relatedPages