Насколько я понимаю, вы не хотите, чтобы форма предоставляла данные, где число и дата текущего месяца уже существуют
Пытаясь воспроизвести это, я придумала это решение
<?php
namespace App\Http\Controllers;
use App\Foo;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class FooController extends Controller
{
public function store(Request $request)
{
$date = Carbon::createFromDate($request->date);
$month = $date->format('Y-m'); // Keep year attached
$days = $date->daysInMonth;
$request->validate([
'date' => 'required|date',
'number' => [
'required',
'integer',
Rule::unique('foos')->where(function ($query) use ($request, $month, $days) {
return $query
->whereBetween('date', ["$month-01", "{$month}-{$days}"])
->whereNumber($request->number);
}),
],
]);
$foo = new Foo();
$foo->date = $request->date;
$foo->number = $request->number;
$foo->save();
return $foo;
}
}
Имея такую форму
<form action="/" method="post">
@csrf
<input type="date" name="date" value="2019-10-19"><br>
<input type="number" name="number" value="3"><br>
<button type="submit">Submit</button>
</form>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
И такой маршрут
Route::post('/', 'FooController@store');
И такую миграцию таблиц
Schema::create('foos', function (Blueprint $table) {
$table->bigIncrements('id');
$table->date('date');
$table->integer('number');
$table->unique(['date', 'number']);
$table->timestamps();
});
Результаты:
Первая публикация 10-19-2019 и 3 действительна
Вторая публикация того же недействительного
Регистрация 10-20-2019 и 3 недействительна (3 уже существует с октября)
Публикация с другим номером действительна
Публикация 11-19-2019 и 3 действительна
Надеюсь, это поможет