如何在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_key
或 api_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 个表