Laravel Table 的自定义验证

Laravel Custom Validation for Table

table 'angkatan'

我有一个名为 'angkatan' 的 table,它有 ID、id_angkatan、nama_angkatan 和状态。 status 列是枚举,包含 'aktif' 和 'tidak aktif'。 我想在 Laravel 中为这个 table 提供规则,其中这个 table 只允许最多 4 个和最少 1 个状态 'aktif'。没有多少状态的规则'tidak aktif'


$jml_angkatan_aktif = \App\Models\Angkatan::where('status', 'Aktif')->get('id_angkatan')->count();

使用 $jml_angkatan_aktif 变量我得到 id_angkatan 的数量 'Aktif' 所以我可以计算它是否超过 4 和低于 1。但问题是我可以' 提供此自定义验证。此自定义验证的目的是我希望如果此 table 中已经有 4 个状态 'aktif',则人们无法添加 'angkatan'。我希望你能理解我的解释。这是 AngkatanController 店内方法的代码。

public function store(Request $request) {
    $validator = Validator::make($request->all(),[
        'id_angkatan' => 'required|unique:angkatan',
        'nama_angkatan' => 'required|unique:angkatan',
        'status' => ['required', function ($attribute, $e) { 
            $jml_angkatan_aktif = \App\Models\Angkatan::where('status', 'Aktif')->get('id_angkatan')->count();
            if ($jml_angkatan_aktif > 4) {
                $e('Batas Maksimal '.$attribute.' Aktif untuk Angkatan adalah 4');
            }
            elseif ($jml_angkatan_aktif < 1) {
                $e('Batas Minimal '.$attribute.' Aktif untuk Angkatan adalah 1');
            }
        },
    ],
    ]);

    if($validator->fails()) {
        return response()->json(['status'=>0, 'error'=>$validator->errors()->toArray()]);
    } else {
        $angkatan = new Angkatan;
        $angkatan->id_angkatan = $request->id_angkatan;
        $angkatan->nama_angkatan = $request->nama_angkatan;
        $angkatan->status = $request->status;
        
        $query = $angkatan->save();
        if ($query) {
            return response()->json(['status'=>1, 'msg'=>'Angkatan Berhasil Ditambah']);
        }
    }        
}

这里是'angkatan'的页面浏览量列表 view of page

您是否看过 this laravel 创建自定义规则的文档?

您似乎在闭包中错过了 $value 争论:

'status' => ['required', function ($attribute, $value, $e) { 
        $jml_angkatan_aktif = \App\Models\Angkatan::where('status', 'Aktif')->get('id_angkatan')->count();
        if ($jml_angkatan_aktif > 4) {
            $e('Batas Maksimal '.$attribute.' Aktif untuk Angkatan adalah 4');
        }
        elseif ($jml_angkatan_aktif < 1){
            $e('Batas Minimal '.$attribute.' Aktif untuk Angkatan adalah 1');
        }
    },

我终于得到了我想要的结果,使用嵌套解决了问题,这是最终代码

public function edit(Request $request, $id)
{
    $angkatan_aktif = \App\Models\Angkatan::where('status', 'Aktif')->get();

    $angkatan = Angkatan::find($id);
    $angkatan->id_angkatan = $request->id_angkatan;
    $angkatan->status = $request->status;
    $angkatan->nama_angkatan = $request->nama_angkatan;
    $angkatan->status = $request->status;

    if($angkatan_aktif->count() == 4){

        if($angkatan->status == "Aktif"){

            return redirect('/pengaturan')->with('pesan-angkatan-error', 'Gagal edit! Angkatan Aktif Sudah Mencapai Batas Maksimum : 4');
        
        }
        
        elseif($angkatan->status == "Tidak Aktif"){

            $query = $angkatan->save();
            if ($query){
                return redirect('/pengaturan')->with('pesan-angkatan', 'Angkatan Berhasil Diedit');
            }

        }
    }
    elseif($angkatan_aktif->count() < 4){

        $query = $angkatan->save();
        if ($query){
            return redirect('/pengaturan')->with('pesan-angkatan', 'Angkatan Berhasil Diedit');
        }
    }
}  

这是结果,使用 blade 条件添加按钮不会出现,所以使用存储方法不会打扰我,现在我不能再添加 'angkatan' if status 'aktif' = 4 状态 'aktif' 也没有通过我想要的更新方法超过 4。

if status 'aktif' < 4


if status 'aktif' = 4