Как сделать валидацию уникальной по дате и по некоторому числовому столбцу, но дата занимает только год-месяц - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь создать уникальные правила для LARAVEL, в которых указано, что YYYY-MM и NUMBER_COLUMN одинаковы = возвращать ошибку / предупреждение. но я могу сделать только YYYY-MM-DD и NUMBER_COLUMN - это то же самое = ошибка возврата.

Так что, когда я пытаюсь ввести тот же номер number_column, но в другой день, он получит данные в таблицу, я хочуэтот столбец number_column не может быть одинаковым за месяц

MyCode:

$form->number('deed_number', 'Nomor Akta')->placeholder('Nomor Akta')
    ->creationRules(['required', "unique_month_date"])
    ->updateRules(['required', "unique_month_date"]);
$form->date('date', 'Tanggal Akta')->placeholder('Tgl Akta')->rules('required');

Таблица, которую я хочу:

NUMBER_COLUMN ; DATE_COLUMN

1 ; 2019-10-19 [Allowed]

2 ; 2019-10-19 [Allowed]

3 ; 2019-10-19 [Allowed]

3 ; 2019-10-20 [NotAllowed] <<< But it acceptable into database for current rule

deed_notary_numbers:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateDeedNotaryNumbersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('deed_notary_numbers', function (Blueprint $table) {
            $table->increments('id');
            $table->bigInteger('number')->unique();
            $table->integer('deed_number');
            $table->string('date');
            $table->string('title');
            $table->tinyInteger('creditor_id');
            $table->tinyInteger('creditor_manager_id');
            $table->tinyInteger('costumer_id');
            $table->tinyInteger('user_id')->nullable();
            $table->longText('notes')->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('deed_notary_numbers');
    }
}

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Второй способ решения этой проблемы, который я обнаружил, это:

Отделите столбец «дата» от запрошенной формы, затем сохраните его в НОВУЮ КОЛОННУ, которую я назвал «yyyy_mm», чтобы он сохранил из:

"дата" => "2019-10-21" до "гггг-мм" => "2019-10".

Дата разделения:

$splitDate = explode("-", $request->date);
$yearDate = $splitDate[0];
$monthDate = $splitDate[1];

Уникальное правило:

'deed_number' => [
    'required',
    'integer',
    Rule::unique('deed_notary_numbers')->where(function ($query) use ($request, $yearDate, $monthDate) {
        return $query
            ->where('yyyy_mm', "$yearDate-$monthDate")
            ->where('deed_number', $request->deed_number);
    })->ignore($id) // For UpdateRule cause it will said already in database if no ignore

И это решило мою проблему

0 голосов
/ 19 октября 2019

Насколько я понимаю, вы не хотите, чтобы форма предоставляла данные, где число и дата текущего месяца уже существуют

Пытаясь воспроизвести это, я придумала это решение

<?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 действительна

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...