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