通过 id 获取记录并使用 Laravel 和 eloquent 查询与“中间”的关系

Posted

技术标签:

【中文标题】通过 id 获取记录并使用 Laravel 和 eloquent 查询与“中间”的关系【英文标题】:getting records by id and querying there relation with 'wherebetween' using Laravel and eloquent 【发布时间】:2021-08-17 22:44:40 【问题描述】:

我正在尝试从某个记录器在某个时间跨度之间获取所有测量值。 如果我删除查询的“->wherebetween()”部分并查看结果,那么我将获得该记录仪的所有传感器以及该传感器的所有相关测量值。 但我无法在关系上执行中间关系。

在控制器中查询

public function getChart(Request $request) 
    $sensorCollection = Sensor::where('recorder_id', $request->recorder_id)
        ->with('getMeasurementsRelation')
        ->wherebetween('getMeasurementsRelation', function ($query) use ($request) 
            return $query->wherebetween('timestamp',[$request->start_chart, $request->end_chart]);)
            ->get();

传感器模型中的关系

public function getMeasurementsRelation() 
        return $this->hasmany('App\Models\measurement', 'sensor_id', 'id');

【问题讨论】:

你能贴出 start_chart 和 end_chart 的值格式是什么。也就是 timestamp 是 timestamp 类型 @JohnLobo start_chart 和 end_chart 值通过 字段提供,格式为“YYYY-mm-dd”示例 =“2021-05-10”。 “timestamp”列属于“timestamp”类型。 检查我的答案 【参考方案1】:

您可以通过以下方法使用回调。由于您没有提到开始和结束图表值格式。所以我假设它的 Ymd 格式。如果没有在评论中告诉我,我可以根据您的需要修改我的答案

$sensorCollection = Sensor::where('recorder_id', $request->recorder_id)
        ->with(['getMeasurementsRelation'=>function($query)use($request)
            $startChart=\Carbon\Carbon::createFromFormat('Y-m-d',$request->start_chart)->startOfDay();

            $endChart=\Carbon\Carbon::createFromFormat('Y-m-d',$request->end_chart)->endOfDay();

            $query->wherebetween('timestamp',[$startChart, $endChart]);
        ])

        ->get();

【讨论】:

成功了,谢谢!!!我添加了“->startOfDay ()”和“->endOfDay ()”来将时间格式化为固定点。如果没有这种额外的格式,我会根据您搜索的时间(H:m:s)得到不同的起点和终点。 @vennot_be.okay 很高兴您解决了问题

以上是关于通过 id 获取记录并使用 Laravel 和 eloquent 查询与“中间”的关系的主要内容,如果未能解决你的问题,请参考以下文章

获取多级相关记录 laravel

选择数组中的值,分离并查询数据库 laravel

在laravel中不使用表单删除记录

Laravel - 使用对象数组更新并将记录保存到数据库

Laravel上一个和下一个记录

在Laravel 5中通过ID和所有外国人递归获取记录