我有两个表,一个表包含用户,一个表包含其文档的名称。第一个表包含两列:id和username。第二个由三列组成:id,userid和document_name。

现在,我正在尝试在控制器中创建查询。理想情况下,应该是如果某人访问website.com/{documentname},它将显示所有者的用户名。此外,仅当当前登录用户是文档的所有者时,才应该发生这种情况。但是,事实证明这比我想象的要困难得多。在这种情况下,我看不到我在做什么错。

这是查询:

$user = DB::table('documents')
            ->join('users', function($join)
            {
                $join->on('users.id', '=', 'documents.userid')
                     ->where('documents.userid', '=', Auth::id())
                     ->where('documents.document_name', '=', $document_name);
            })
            ->get();

最佳答案

$document_name不在join函数范围内:您需要通过use将其传递给闭包

$user = DB::table('documents')
        ->join('users', function($join) use ($document_name)
        {
            $join->on('users.id', '=', 'documents.userid')
                 ->where('documents.userid', '=', Auth::id())
                 ->where('documents.document_name', '=', $document_name);
        })
        ->get();


编辑

因为WHERE条件适用于基表,而不适用于JOIN:

$user = DB::table('documents')
        ->join('users', function($join) {
            $join->on('users.id', '=', 'documents.userid')
        })
        ->where('userid', '=', Auth::id())
        ->where('document_name', '=', $document_name);
        ->get();

10-07 12:58
查看更多