如何在laravel中加入同一个表

时间:2015-03-11 06:19:43

标签: laravel join inner-join laravel-5

我想写一个连接查询来连接同一个表,没有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 

4 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

不使用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

答案 2 :(得分:0)

我通过创建自己的类并从基础查询开始解决了该问题,我对其进行了修改以应用联接(使用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()以获得结果。

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

答案 3 :(得分:0)

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');