【问题标题】:How to Join same table in laravel如何在laravel中加入同一张表
【发布时间】:2015-05-12 20:15:24
【问题描述】:

我想写一个连接查询来连接同一个表,并且没有ON,但是当我在 laravel 中写它时显示错误

$key = DB::table('api_keys as ak')  
->join('api_keys as bk','') 
              ->where('ak.api_key', $api_key)->where('ak.user_id',0)
              ->pluck('api_key');

想要构建以下查询,

SELECT * FROM `api_keys` as ak
  JOIN `api_keys` as bk
 WHERE ak.`api_key`=$akey
   and ak.`user_id`=$auser
   and bk.`user_id`=$bsuer
   and bk.`api_key`=$bkey 

【问题讨论】:

    标签: laravel join inner-join laravel-5


    【解决方案1】:

    您必须为连接提供ON 子句。更多关于哪里需要ON 子句可以在this answer 中找到。

    您可以在 QueryBuilder 对象上使用 toSql() 查看生成的查询:

    echo $key = DB::table('api_keys as ak')  
        ->join('api_keys as bk','') 
        ->where('ak.api_key', $api_key)->where('ak.user_id',0)
        ->toSql();
    

    在您的情况下返回:

    select * from `api_keys` as `ak` inner join `api_keys` as `bk`
    on `` `` where `ak`.`api_key` = ? and `ak`.`user_id` = ?
    

    在您的情况下,您要达到的目标并不完全清楚,但您可以考虑加入 api_keyapi_keys 表的主键,如果不同的话:

    $key = DB::table('api_keys as ak')  
        ->join('api_keys as bk','ak.api_key', '=', bk.api_key) 
        ->where('ak.api_key', $api_key)->where('ak.user_id',0)
        ->pluck('api_key');
    

    【讨论】:

      【解决方案2】:

      在 laravel 查询生成器中不使用 on 子句,您可以使用以下

      $key = DB::table(DB::raw('api_keys as ak, api_keys as bk'))
                ->where('ak.api_key', '=', $api_key)
                ->where('ak.user_id','=',0)
                ->where('ak.PK','=','bk.PK')
                ->pluck('ak.api_key')
      

      其中 PK 引用您的表的主键。 结果会在你的情况下。

      select * from api_keys as ak, api_keys as bk where ak.api_key= 'api_key_value' and ak.user_id = 0 and ak.PK = bk.PK
      

      【讨论】:

        【解决方案3】:
        DB::table('registerusers as a')
          ->join('registerusers as b', 'a.id', 'b.refer_id')
          ->where('a.username', 'b.username')
          ->where('b.id', 'a.refer_id')
          ->value('b.id');
        

        【讨论】:

        • 在简单的时候不要做得太复杂。
        【解决方案4】:

        我通过创建自己的类并从我修改以应用联接(使用 Laravel 的 joinSub 函数)的基本查询开始解决了这个问题,如下所示:

        public function __construct()
        {
             $this->query = DB::table('question_responses as BASE');
        }
        
        public function applyFilter($questionId, $questionValue) {
            $filterTableStr = 'filter_table_'.$questionId;
            $filterIdStr = 'filter_id_'.$questionId;
            $filterQuery = DB::table('question_responses AS '.$filterTableStr)
                ->select('survey_response_id AS '.$filterIdStr)
                ->where($filterTableStr.'.question_short_name', $questionId)
                ->where($filterTableStr.'.value', $questionValue);
        
            $resultTableStr = 'result_table_'.$questionId;
            $this->query = $this->query
                ->joinSub($filterQuery, $resultTableStr, function($join) use ($resultTableStr, $filterIdStr) {
                    $join->on('BASE.survey_response_id', '=', $resultTableStr.'.'.$filterIdStr);
                });
        }
        

        应用我所需的过滤器后,我可以像往常一样调用$this->query->get() 来获取结果。

        重要的部分是确保每个结果表和连接字段都有唯一的名称。 使用这种方法,我可以对我的基本查询应用无限的过滤器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 2020-03-24
          • 1970-01-01
          • 2014-03-17
          • 1970-01-01
          • 2010-09-17
          相关资源
          最近更新 更多