【问题标题】:Join eloquent collection with result of procedure将 eloquent 集合与过程的结果相结合
【发布时间】:2022-01-14 11:15:57
【问题描述】:

我有以下雄辩的合集:

$cars = Car::with(['model'])->get();

我还有一个 mysql 存储过程,它可以根据日期范围计算一些度量值:

$getMeasure = DB::select(
            'CALL measure("'.$start_date.'", "'.$end_date.'")'
         );

该过程产生的两列是 car_id 和 measure。

是否有可能在选择汽车时通过将其与过程结果连接来获得度量列?

我尝试过这样做:

$cars = Car::with(['model'])
        ->join('call measure("'.$start_date.'", "'.$end_date.'")', 'car.id', '=', 'measure.car_id')
        ->get();

但这不起作用,因为它正在寻找一个名为“call measure”的表。

【问题讨论】:

  • 如果您愿意,可以使用Query Builder 来实现。通常,您必须在子查询中运行存储过程并为子查询提供别名。然后别名将充当任意表名。您能否edit your question 并在您的Car.php 模型文件中提供您的相关数据库架构和model(...) 关系方法的实现?

标签: mysql laravel eloquent


【解决方案1】:

根据这里的大多数答案:How can I join on a stored procedure? 使用存储过程 (SP) 进行连接并不是真正可行的策略。

最好将 SP 内联为 subquery,或使用函数。

$measures = DB::query()
    ->select('.... as car_id', '.... as measure') // use DB::raw() or selectRaw() if the expressions contain functions, aggregate values or computed values
    ->from(....)
    .... // no ->get();

$cars = Car::with(['model'])
    ->joinSub($measures, 'measures', function ($join) {
        $join->on('cars.id', '=', 'measures.car_id');
    })
    ->get();

上次我检查时,Laravel 的 SP 有点问题,您需要将一些特定选项传递给底层 PDO 实例才能使其工作。


如果您在整个代码中大量使用它并希望避免一遍又一遍地重复代码,我认为您可以为子查询创建一个查询构建器宏。

【讨论】:

  • 我相信你的源代码中有一个多余的->get();
  • @steven7mwesigwa 你是对的。这是一个错字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多