我正在尝试使用查询生成器来执行连接,该连接使用ON和WHERE提取存在于两个表(内连接)中的所有记录 . 它在我执行原始SQL并且给我9k记录的计数时起作用但是当我使用查询构建器时,我的计数每次都是0 . 我究竟做错了什么?
Laravel Query Builder
$count = DB::table('listings_queue')
->join('listings', function($join)
{
$join->on('listings_queue.mls_listing_id', '=', 'listings.mls_listing_id')
->where('listings.mls_id','=','listings_queue.mls_id')
->where('listings.city' , '=', 'listings_queue.city');
})
->count();
$this->info($count);
Raw SQL
select * from listings_queue
INNER JOIN listings
ON `listings_queue`.`mls_listing_id` = `listings`.`mls_listing_id`
WHERE `listings`.`mls_id`=`listings_queue`.`mls_id`
AND `listings`.`city`=`listings_queue`.`city`
现在,我当然不是很聪明,但我发誓这些都是一样的 . 知道我在Laravel做错了什么吗?
5 回答
您是否尝试在链式方法的末尾添加 - > toSql()而不是count()?这将打印sql,您可以验证查询是否与原始查询完全相同 .
另外,试试这个:
在查询构建器连接中,将方法作为绑定参数处理的第三个参数 . 尝试使用whereRaw .
您发布的原始SQL略有不同,但我认为它会产生相同的结果 .
我实际上碰到了很多这个 . 蒂姆建议whereRaw工作,但有一些更清洁的选择 .
首先,我们可以传递包含在DB :: raw()中的第3个参数 .
更好的是,我们可以将多个调用链接到 - >,其中第三个参数是列名,而不是绑定变量 .
如果你看看实际生成的sql,这个问题很难发现 . 列名包含在刻度线 ` 中,字符串用单引号 ' 包装 . 您发布的查询的最终结果将具有类似的结果 .
你想看到的是......
有关记录SQL查询的帮助,请参阅我的其他答案Laravel 4 - logging SQL queries
有两种方法可以做到这一点,第一种方法是查询构建器api,第二种方法是通过编写原始查询,这不是一种安全的做法,你可以尝试最适合你的方法 .
1 st方式
2和方式