Laravel Красноречивый запрос к сводной таблице - PullRequest
0 голосов
/ 10 февраля 2020

В моей базе данных есть следующие таблицы:

trips
    start - date
    end - date
    type - string

users
    name - string
    age - integer

trip_users (pivot table for many to many relationship)
    trip_id - integer
    user_id - integer

Я хочу, чтобы пользователи с возрастом между xy имели поездки между dateA и dateB, используя Eloquent.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Попробуйте добавить область или два к вашей модели.

// User.php

protected $with = ['trips'];

public function trips() {
    return $this->belongstoMany(Trip::class);
}

// scope for age
public function scopeAgeBetween($query, $age1, $age2) {
    return $query->whereBetween('age', [$age1, $age2]);
}

// scope for trip dates
public function scopeTripDatesBetween($query, $dateStart, $dateEnd) {
    return $query->whereDate('trips.start', '>=', $dateStart)
        ->whereDate('trips.end', '<=', $dateEnd);
}

Затем в вашем коде:

User::with('trips')->ageBetween(20, 30)->tripDatesBetween('2020-01-01', '2020-02-01')->get();
1 голос
/ 10 февраля 2020

Я думаю, вы ищете что-то вроде этого:

User::query()
->whereBetween('age', [$x, $y])
->whereHas('trips', function ($q) {
    $q->where('start', '>', $dateA)
      ->where('end', '<', $dateB)
})
->get();
...