【问题标题】:Laravel/Eloquent query going wrongLaravel/Eloquent 查询出错
【发布时间】:2014-08-30 10:10:41
【问题描述】:

我有两张表,一张是用户,一张是他们的文档名称。第一个表由两列组成:id 和用户名。第二个由三列组成: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();

【问题讨论】:

    标签: php mysql sql laravel eloquent


    【解决方案1】:
      **Try this query :** 
    
    
    
     $user =  DB::table('documents')
      ->leftJoin('users', 'users.id', '=', 'documents.userid')
      ->where('documents.userid', '=', Auth::id())
      ->where('documents.document_name', '=', $document_name);
      ->get();
    

    【讨论】:

      【解决方案2】:

      $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();
      

      【讨论】:

      • 好的,现在如果我这样做{{ $user->username }},我会得到Trying to get property of non-object
      • 启用数据库登录 config/database.php 以查看实际构建的 SQL 查询
      • select * from documents inner join users on users.id = documents.id and documents.userid = '1' and documents.document_name = 'testdoc'
      • 所以你真的应该应用 JOIN 的 outsidewhere 子句
      猜你喜欢
      • 2017-10-22
      • 2015-02-22
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2021-05-28
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多