Красноречивый запрос для запроса БД с несколькими объединениями - PullRequest
0 голосов
/ 06 января 2020

Мои упрощенные отношения модели:

User (id, email) → Timeline (id, user_id) → Activity (id, timeline_id) → Trackpoint(id, activity_id)

Q1: Как получить Трекпоинты для определенного c пользователя и диапазона дат?
Q2: Как получить Временную шкалу для определенной Трекпоинта ?

В настоящее время я использую запрос БД для Q1, но надеялся, что был более ... Красноречивый способ.

        $trackpoints = DB::table('trackpoints')
            ->join('activities', 'activities.id', '=', 'trackpoints.activity_id')
            ->join('timelines', 'timelines.id', '=', 'activities.timeline_id')
            ->where('timelines.user_id', 1)
            ->whereBetween('trackpoints.timestamp',['2019-12-13','2019-12-16'])

Или это требует, например, https://github.com/staudenmeir/belongs-to-through?

1 Ответ

1 голос
/ 06 января 2020

В первом случае Laravel не имеет встроенной поддержки прямых отношений. Вы можете использовать один из моих других пакетов: https://github.com/staudenmeir/eloquent-has-many-deep

class User extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function trackpoints()
    {
        return $this->hasManyDeep(
            Trackpoint::class, [Timeline::class, Activity::class]
        );
    }
}

$trackpoints = User::find($id)->trackpoints()
    ->whereBetween('trackpoints.timestamp', ['2019-12-13','2019-12-16'])
    ->get();

Для второго запроса вы можете использовать пакет от общего к , который вы упомянули :

class Trackpoint extends Model
{
    use \Znck\Eloquent\Traits\BelongsToThrough;

    public function timeline()
    {
        return $this->belongsToThrough(Timeline::class, Activity::class);
    }
}

$timeline = Trackpoint($id)->timeline;

В Laravel 5.8+ вы также можете использовать собственные отношения HasOneThrough:

class Trackpoint extends Model
{
    public function timeline()
    {
        return $this->hasOneThrough(
            Timeline::class, Activity::class,
            'id', 'id',
            'activity_id', 'timeline_id'
        );
    }
}

$timeline = Trackpoint($id)->timeline;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...