[英]Eloquent representation of SQL query
Hello i'm using Eloquent with Slim in my project. 你好我在项目中使用Eloquent和Slim。 I have created models: Reservation, ReservationCottage(linking table), Cottage with relations : reservations to cottages like N - N, and now i want to know how can i change my SQL query for the Eloquent query. 我创建了模型:预订,ReservationCottage(链接表),有关系的小屋:预订到N-N等小屋,现在我想知道如何更改我的SQL查询以查找Eloquent。
class Reservation extends Model
{
protected $table = 'reservations';
protected $fillable = [
'start',
'end',
];
public function cottages()
{
return $this->belongsToMany(Cottage::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
public function reservationStatus()
{
return $this->belongsTo(ReservationStatus::class);
}
public function payments()
{
return $this->hasMany(Payment::class);
}
}
class ReservationCottage extends Model
{
protected $table = 'reservation_cottages';
public function guests()
{
return $this->hasMany(Guest::class);
}
}
class Cottage extends Model
{
protected $table = 'cottages';
protected $fillable = [
'name',
'capacity',
'description',
'base_price',
];
public function additions()
{
return $this->belongsToMany(Addition::class);
}
public function cottagePeriods()
{
return $this->hasMany(CottagePeriod::class);
}
public function periods()
{
return $this->belongsToMany(Period::class);
}
public function reservations()
{
return $this->belongsToMany(Reservation::class);
}
public function cottageStatus()
{
return $this->belongsTo(CottageStatus::class);
}
and this is query wchih check if period(from @ArrivalDate
to @DepartureDate
) is available in reservations table : 这是查询wchih检查是否在预订表中有句点(从@ArrivalDate
到@DepartureDate
):
SELECT cottage.name FROM cottages WHERE id NOT IN (
SELECT cottage_id
FROM reservation_cottages RC
JOIN reservations R
ON R.id = RC.reservation_id
WHERE (r.start <= @ArrivalDate AND R.end >= @ArrivalDate)
OR (R.start < @DepartureDate AND R.end >= @DepartureDate )
OR (@ArrivalDate <= R.start AND @DepartureDate >= R.start)
Ok here is a (hopefully) more helpful answer. 好的,这是一个(希望)更有帮助的答案。 In my example, I use the Laravel Query Builder to create such a complex query. 在我的示例中,我使用Laravel Query Builder来创建这样一个复杂的查询。 Example: 例:
$rows = DB::table('cottages')
->select('cottage.name')
->from('cottages')
->whereNotIn('id', function (Builder $query) {
$query->select('cottage_id')
->from('reservation_cottages AS RC')
->join('reservations AS R', 'R.id', '=', 'RC.reservation_id')
->whereColumn('r.start', '<=', 'ArrivalDate')
->whereColumn('R.end', '>=', 'ArrivalDate')
->orWhere(function (Builder $query) {
$query->whereColumn('R.start', '<', 'DepartureDate')
->whereColumn('R.end', '>=', 'DepartureDate');
})
->orWhere(function (Builder $query) {
$query->whereColumn('ArrivalDate', '<=', 'R.start')
->whereColumn('DepartureDate', '>=', 'R.start');
});
})->get();
Generated SQL: 生成的SQL:
SELECT
`cottage`.`name`
FROM
`cottages`
WHERE `id` NOT IN
(SELECT
`cottage_id`
FROM
`reservation_cottages` AS `RC`
INNER JOIN `reservations` AS `R` ON `R`.`id` = `RC`.`reservation_id`
WHERE `r`.`start` <= `ArrivalDate`
AND `R`.`end` >= `ArrivalDate`
OR (
`R`.`start` < `DepartureDate`
AND `R`.`end` >= `DepartureDate`
)
OR (
`ArrivalDate` <= `R`.`start`
AND `DepartureDate` >= `R`.`start`
));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.