Como criar uma subconsulta usando Laravel Eloquent?

Eu tenho a seguinte consulta Eloquent (Esta é uma versão simplificada de uma consulta que consiste em mais where s e orWhere são, portanto, a orWhere indireta aparente de ir sobre isso – a teoria é o que é importante):

 $start_date = //some date; $prices = BenchmarkPrice::select('price_date', 'price') ->orderBy('price_date', 'ASC') ->where('ticker', $this->ticker) ->where(function($q) use ($start_date) { // some wheres... $q->orWhere(function($q2) use ($start_date){ $dateToCompare = BenchmarkPrice::select(DB::raw('min(price_date) as min_date')) ->where('price_date', '>=', $start_date) ->where('ticker', $this->ticker) ->pluck('min_date'); $q2->where('price_date', $dateToCompare); }); }) ->get(); 

Como você pode ver, coloquei a primeira data que ocorre no ou no início da data de início. Isso resulta em uma consulta separada sendo executada para obter essa data que é usada como um parâmetro na consulta principal. Existe uma maneira de ser eloquente para incorporar as consultas juntas para formar uma subconsulta e, portanto, apenas uma chamada de database em vez de 2?

Editar:

De acordo com a resposta da @ Jarek, esta é a minha consulta:

 $prices = BenchmarkPrice::select('price_date', 'price') ->orderBy('price_date', 'ASC') ->where('ticker', $this->ticker) ->where(function($q) use ($start_date, $end_date, $last_day) { if ($start_date) $q->where('price_date' ,'>=', $start_date); if ($end_date) $q->where('price_date' ,'where('price_date', DB::raw('LAST_DAY(price_date)')); if ($start_date) $q->orWhere('price_date', '=', function($d) use ($start_date) { // Get the earliest date on of after the start date $d->selectRaw('min(price_date)') ->where('price_date', '>=', $start_date) ->where('ticker', $this->ticker); }); if ($end_date) $q->orWhere('price_date', '=', function($d) use ($end_date) { // Get the latest date on or before the end date $d->selectRaw('max(price_date)') ->where('price_date', 'where('ticker', $this->ticker); }); }); $this->prices = $prices->remember($_ENV['LONG_CACHE_TIME'])->get(); 

Os blocos orWhere estão fazendo com que todos os parâmetros na consulta de repente se tornem não incluídos. Eg WHERE price_date >= 2009-09-07 . Quando eu remover o orWheres a consulta funciona bem. Por que é isso?

É assim que você faz uma subconsulta onde:

 $q->where('price_date', function($q) use ($start_date) { $q->from('benchmarks_table_name') ->selectRaw('min(price_date)') ->where('price_date', '>=', $start_date) ->where('ticker', $this->ticker); }); 

Infelizmente, orWhere exige um $operator explicitamente fornecido, caso contrário, ele levantará um erro, então, no seu caso:

 $q->orWhere('price_date', '=', function($q) use ($start_date) { $q->from('benchmarks_table_name') ->selectRaw('min(price_date)') ->where('price_date', '>=', $start_date) ->where('ticker', $this->ticker); }); 

EDIT: Você precisa especificar no fechamento de fato, caso contrário, não irá criar uma consulta correta.