加入不使用Laravel Query Builder

时间:2014-03-07 03:32:50

标签: mysql laravel laravel-4 eloquent query-builder

我正在尝试使用查询生成器执行连接,该连接使用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做错了吗?

5 个答案:

答案 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`");