laravel - 在人际关系之间有更好更干净的方式吗?
问题描述
我正在进行 API 开发,并且正在获得我正在寻找的结果,但我认为这不是在某些关系之间执行此代码的干净和最佳方式,并且希望阅读更好的建议办法。
我正在寻找两个日期和一个用户范围内的计时跟踪结果。
我们有三个表/模型: - 用户 - 行程(带有字段 user_id) - 轨道(带有字段 trip_id)
重要提示:tracks 表的每一行有两个日期,“start_datetime”和“stop_datetime”。
我的代码:
// We get all the 'trip_id' from the dates range
$alltracks = Track::whereBetween('start_datetime', [$datefrom, $dateto])->orWhereBetween('stop_datetime', [$datefrom, $dateto])->pluck('trip_id')->toArray();
// We get all the 'trips_id' of the user $id on the range
$trips = Trip::where('user_id', $id)->whereIn('id', $alltracks)->pluck('id')->toArray();
// If we have results, we check again to get the right tracks
if ($trips != null) {
$tracks = Track::whereBetween('start_datetime', [$datefrom, $dateto])
->orWhereBetween('stop_datetime', [$datefrom, $dateto])
->whereIn('trip_id', $trips)
->orderBy('start_datetime', 'ASC')->get();
} else {
return response()->json(['status' => 404, 'message' => 'There are no trips on this range for this driver'], 404);
}
我得到了我正在寻找的结果,但这让我疯狂地对结果进行 3 次查询。
解决方案
您可以使用内部联接在一个查询中执行此操作。要在 Laravel 中使用连接,请使用 DB Facade。
//Using the DB facade
use Illuminate\Support\Facades\DB;
要获得您想要的曲目:
$tracks = DB::table('tracks')
->select('tracks.*','trips.*') //select needed columns
->join('trips','trips.id','=','tracks.trip_id')
->whereBetween('tracks.start_datetime', [$datefrom, $dateto])
->orWhereBetween('tracks.stop_datetime', [$datefrom, $dateto])
->where('trips.user_id',$id)
->orderBy('tracks.start_datetime', 'ASC')
->get();
get 方法返回一个包含结果的 Illuminate\Support\Collection,其中每个结果都是 PHP stdClass 对象的一个实例。
推荐阅读
- jmeter - 如何生成 JSON 格式的 HTTP 请求响应数据?
- angular - Angular HTTP 请求中缺少协商令牌
- multithreading - 如果并发线程数为 10 且 SysTick 时间为 10mSec,则 1 个线程执行时间(量子)是多少?
- java - 如何在 RHEL RedHatLinux 机器上验证哪个 openjdk 发行版供应商?
- jquery - 在rails条件中使用js变量
- java - 鼠标滚轮上的水平滚动不适用于 RecyclerView Android
- vb.net - Option Strict On 不允许在 vb.net 中进行后期绑定
- javascript - 如何在后端 express 函数中访问当前 url 中的参数?(见说明)
- android-studio - 当我运行我的项目时,为什么会出现这个错误?
- typescript - 在 Angular 6 中集成 Stripe 支付网关时面临“需要卡”错误