如何在 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
这是我的代码:
$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