acs Kendi örneğinizde where şartlarını gruplamanız lazım:
$q->where(function() use ($postFr) {
$q->whereDate('start_date', '<=', $postFr)
->whereDate('end_date', '>=', $postFr);
})->orWhere(function() use ($postTo) {
$q->whereDate('start_date', '<=', $postTo)
->whereDate('end_date', '>=', $postTo);
});
Siz burada, verilen değeri iki sütun arasında aradığınız için whereBetween kullanamazsınız. Şöyle bir şey yapabilirsiniz ama:
namespace App\Mixins;
/**
* @mixin \Illuminate\Database\Eloquent\Builder
*/
class ExtendedEloquent
{
public function whereValueBetween()
{
return function($value, array $between) {
[$from, $to] = $between;
return $this->whereRaw("? between {$from} and {$to}", [
$value,
]);
};
}
public function orWhereValueBetween()
{
return function($value, array $between) {
[$from, $to] = $between;
return $this->orWhereRaw("? between {$from} and {$to}", [
$value,
]);
};
}
}
AppServiceProvider::boot() içerisine şu şekilde ekliyorsunuz:
use App\Mixins\ExtendedEloquent;
use Illuminate\Database\Eloquent\Builder;
Builder::mixin(new ExtendedEloquent);
Artık şu şekilde kullanabilirsiniz:
$periods = Period::whereValueBetween($postFr, ['start_date', 'end_date'])
->orWhereValueBetween($postTo, ['start_date', 'end_date'])
->get();
['start_date', 'end_date'] kesinlikle dışarıdan gelen ya da kullanıcıdan alınan bir değer olmamalıdır yoksa SQL injection yersiniz.
Daha basit bir yol ise scope kullanmak
https://laravel.com/docs/8.x/eloquent#query-scopes