首页 > 解决方案 > 在人际关系之间有更好更干净的方式吗?

问题描述

我正在进行 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 次查询。

标签: laraveleloquent

解决方案


您可以使用内部联接在一个查询中执行此操作。要在 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 对象的一个​​实例。


推荐阅读