У меня есть три модели:
Rental.php
class Rental extends Model
{
use SoftDeletes;
public function rentalItem()
{
return $this->hasMany('App\Models\RentalItem');
}
}
RentalItem.php
class RentalItem extends Model
{
public function rentalAsset()
{
return $this->belongsTo('App\Models\RentalAsset');
}
public function rental()
{
return $this->belongsTo('App\Models\Rental');
}
}
и RentalAsset.php
class RentalAsset extends Model
{
public function rentalItem()
{
return $this->hasMany('App\Models\RentalItem');
}
}
One Rental может иметь несколько RentalItems, принадлежащих RentalAsset.RentalAsset - это карта продукта для каждого RentalItem, поэтому один RentalItem может иметь один RentalAsset.
Когда создается RentalItem, сначала необходимо проверить, доступен ли он в интервале дат.Это делается путем проверки, находится ли между date_from и date_two пункт Rental, имеющий RentalItem, связанный с RentalAsset.
Я хочу запрос, который будет возвращать все RentalAssets, которые не связаны ни с одним RentalItem, связанным с Rental, в течение этих дат.
К сожалению, это не работает правильно:
$freeAssets = RentalAsset::where('rental_asset_category_id', '=', $request->rental_asset_category_id)
->whereDoesntHave('rentalItem.rental', function($query) use($date_from, $date_to)
{
$query->where('date_from', '<=', $date_to);
$query->where('date_to', '>=', $date_from);
})
->get();
Ваша помощь высоко ценится!Большое спасибо.
ОБНОВЛЕНИЕ: с помощью Laravel 5.6
ОБНОВЛЕНИЕ 2: Я выплюнул сгенерированный выбор по предоставленному красноречивому запросу:
select * from `rental_assets` where `rental_asset_category_id` = ? and exists
(select * from `rental_items` where `rental_assets`.`id` = `rental_items`.`rental_asset_id` and not exists
(select * from `rentals` where `rental_items`.`rental_id` = `rentals`.`id`
and `date_from` <= ? and `date_to` >= ? and `rentals`.`deleted_at` is null))
and `rental_assets`.`deleted_at` is null
И этот выбор возвращает то, что янужно:
select * from `rental_assets` where `rental_asset_category_id` = 2
and not exists (
select * from `rental_items` where `rental_assets`.`id` = `rental_items`.`rental_asset_id` and exists
(select * from `rentals` where `rental_items`.`rental_id` = `rentals`.`id`
and `date_from` <= '2018-12-12' and `date_to` >= '2018-01-01' and `rentals`.`deleted_at` is null))
and `rental_assets`.`deleted_at` is null;
Какой правильный красноречивый запрос?Я бы предпочел этот сырой запрос.спасибо.