如何在laravel中加入同一张表

Posted

技术标签:

【中文标题】如何在laravel中加入同一张表【英文标题】:How to Join same table in 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 

【问题讨论】:

【参考方案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() 来获取结果。

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

【讨论】:

以上是关于如何在laravel中加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 eloquent hasmanythrough 或 hasonethrough 在 laravel 中加入 3 个表

如何在 Laravel 中加入来自不同主机的多个数据库

如何检查表是不是已在 Laravel 查询生成器中加入

如何在 SQL 中加入包含祖父-父-子列的表?

如何在 Magento 2.3 中加入两个自定义表

在 laravel 中多次查找同一张表