如何使用Laravel Eloquent创建子查询?

我有以下口才的查询(这是查询的简化版本,其中包含更多wheres和orWheres,因此是实现此目的的明显回旋方式-该理论很重要):

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

如您所见,我pluck最早的约会发生在我的约会上或之后start_date。这导致运行单独的查询来获取该日期,然后将该日期用作主查询中的参数。有没有一种雄辩的方法可以将查询嵌入在一起形成一个子查询,因此只有1个数据库调用而不是2个?

根据@Jarek的答案,这是我的查询:

$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' ,'<=', $end_date);

if ($last_day) $q->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', '<=', $end_date)

->where('ticker', $this->ticker);

});

});

$this->prices = $prices->remember($_ENV['LONG_CACHE_TIME'])->get();

这些orWhere块使查询中的所有参数突然变为未引用状态。例如WHEREprice_date >=

2009-09-07。当我删除orWheres查询工作正常。为什么是这样?

回答:

这是您执行子查询的方式,其中:

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

});

不幸的是,orWhere需要显式提供$operator,否则会引发错误,因此在您的情况下:

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

});


以上是 如何使用Laravel Eloquent创建子查询? 的全部内容, 来源链接: utcz.com/qa/431795.html

回到顶部