Laravel how to get query with bindings?

前端 未结 14 701
小蘑菇
小蘑菇 2021-01-31 15:58

I have some query that I need to pass to another query using query builder

$query = DB::table(\'table\')->whereIn(\'some_field\', [1,2,30])->toSql();

Mode         


        
14条回答
  •  清酒与你
    2021-01-31 16:49

    This is a very old question (2015), but since this is the first Google result I got I think it's worth to give my solution as well, in case it's useful for the next person.

    Eloquent (5.7 onwards I think, I haven't tested more recent or earlier versions) has a method to change a Builder's from to wrap a subquery:

    # Taken from Illuminate/Database/Query/Builder.php - Line 272
    public function fromSub($query, $as) {
        [$query, $bindings] = $this->createSub($query);
    
        return $this->fromRaw('('.$query.') as '.$this->grammar->wrapTable($as), $bindings);
    }
    

    This however requires an already existing instance of \Illuminate\Database\Query\Builder. In order to make an empty one, you can do:

    use Illuminate\Database\Capsule\Manager as DB;
    
    $fancy = DB::table("videogames")->where("uses_sdl2", 1);
    $empty = DB::table(null);
    
    # Wrap the fancy query and set it as the "from" clause for the empty one
    # NOTE: the alias is required
    $empty = $empty->fromSub($fancy, "performant_games");
    
    

    This will warranty that bindings are treated correctly, since they'll be handled by Eloquent itself.

提交回复
热议问题