当前位置: 首页 > 面试题库 >

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

危斯伯
2023-03-14
问题内容

我有以下口才的查询(这是查询的简化版本,其中包含更多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);
});

编辑:您from实际上需要在闭包中指定,否则它将无法建立正确的查询。



 类似资料:
  • 问题内容: 我正在使用Laravel Eloquent查询构建器,并且在一个查询中需要多个条件的子句。它可以工作,但并不优雅。 例: 有没有更好的方法可以执行此操作,还是应该坚持使用此方法? 问题答案: 在Laravel 5.3中从6.x开始仍然适用,您可以使用更细粒度的wheres作为数组传递: 就个人而言,我并没有在多个调用中找到用例,但事实是您可以使用它。 自2014年6月起,您可以将数组传

  • 我正在使用Laravel Eleoquent查询生成器,并且我有一个查询where我想要一个关于多个条件的子句。很管用,但不优雅。 示例: 有没有更好的方法做到这一点,还是我应该坚持这个方法?

  • 问题内容: 我正在使用Python 3.3和tkinter制作用于行人逃生模拟的GUI界面。 我已经编写了两个模拟程序,它们运行良好。但是,当尝试从主应用程序调用它们时,我陷入了困境。我希望模拟窗口出现在单独的窗口中(创建主窗口的子窗口)。 如何使用tkinter从主应用程序启动子窗口? 问题答案: 您可以通过创建的实例来创建子窗口。有关更多信息,请参见http://effbot.org/tkin

  • 问题内容: 我开始学习JPA,并已基于我在SQL Server中测试的以下本机SQL实现了JPA查询示例: 通过上面的SQL,我构造了以下JPQL查询: 如您所见,我仍然缺少原始查询中的条件。我的问题是,如何将其放入JPQL? 问题答案: 写这个; 因为您的学生实体与ClassTbl实体具有一对多关系。

  • 问题内容: 我有以下四个表: SCHEDULE_REQUEST表: ID,APPLICATION_ID(FK) 应用表: ID,代码 USER_APPLICATION表: APPLICATION_ID(FK),USER_ID(FK) 用户表: ID,NAME 现在,我想创建一个条件条件,以便为指定的用户ID 选择。 我有以下代码: 您能帮我如何将查询过滤器传递给关系对象吗?我认为我在 “ appl

  • 查询返回此错误。 Elasticsearch\Common\Exceptions\BadRequest est400Exception:{"error":{"root_cause":[{"type":"parsing_exception","原因":"未知查询[查询]","line": 1,"coll": 62}],"type":"x_content_parse_exception","原因":"