我想写一个连接查询来连接同一个表,没有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
答案 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_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');
答案 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');