首页 文章

加入不使用Laravel Query Builder

提问于
浏览
0

我正在尝试使用查询生成器来执行连接,该连接使用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 回答

  • 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);
    
  • 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();
    
  • 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

  • 0

    有两种方法可以做到这一点,第一种方法是查询构建器api,第二种方法是通过编写原始查询,这不是一种安全的做法,你可以尝试最适合你的方法 .

    1 st方式

    $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();
    

    2和方式

    $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`"));
    
  • 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`");
    

相关问题