Salut à tous !
Je travaille sur un projet d'école et souhaite afficher la donnée mon champ input array dans la partie message de ma form request .
Mon problème est que lorque j'utilise la clé du champ.* dans le helper request on m'affiche que ' array to string conversion. Cependant lorsque je faise cle_champ.0 , la valeur s'affiche et j'ai l'impression que tout fonctionne, et le problème avec tout ça, c'est que c'est toujours la même valeur qui s'affiche.
je vous presente ma form request

<?php

namespace App\Http\Requests;

use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;

class CreateSchoolingRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
            'schooling_school_year'=>'required|',
            'niveau_id_schooling'=>'required|array|',
            'niveau_id_schooling.*'=>'required|distinct',
            'schooling_amount'=>'required|array',
            'schooling_amount.*'=>'required',
            'niveau_id_schooling.*'=>Rule::unique('schoolings','niveau_id')->where('niveau_id',$this->niveau_id_schooling)
            ->where('school_year_id',$this->schooling_school_year),

        ];
    }

    public function messages()
    {

        return [
            'schooling_school_year.required'=>'l\'année Academique est obligatoire ',
            'niveau_id_schooling.*.required'=>'Vous devez ajouter au moins une ligne de données pour le niveau ',
            'schooling_amount.*.required'=>'Vous devez ajouter une ligne de montant pour enregistrer',
            'niveau_id_schooling.*.unique'=>' le niveau '.Request::input('niveau_id_schooling.0').'  est dejà ajouté ',

        ];
    }

    public function failedValidation(Validator $validator)
    {
        $response= response()->json([
            'success' => false,
                'message' => 'Ops! Some errors occurred',
                'errors' => $validator->errors()
        ]);

        throw(new ValidationException($validator,$response));
    }
}

Voici le controller 
<?php

namespace App\Http\Controllers\Admin;
use App\Models\niveau;
use App\Models\Country;
use App\Models\Personne;
use App\Models\Personnel;
use App\Models\Schooling;

use App\Models\SchoolYear;
use App\Models\Nationality;
use Illuminate\Http\Request;
use App\Models\Etablissement;
use App\Models\TypeDirection;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateSchoolingRequest;

class SchoolingController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $school_years=SchoolYear::whereNotNull('activated_at')->latest()->get();
        $niveaux=niveau::all();
        $my_school_year=SchoolYear::whereNotNull('activated_at')->latest()->first();

        $school_year_id=$my_school_year->id;

       $schoolings=Schooling::where('school_year_id',$school_year_id)->latest()->get();

        return view('admin.settings.schooling.index',compact('school_years','niveaux','schoolings'));
    }

    public function get_last_year_schoolings()
    {
        $last_school_year=SchoolYear::whereNotNull('activated_at')->latest()->first();

        $year_id=$last_school_year->id;

       // echo $year_id;

        $schooling_data=Schooling::with('niveau')->where('school_year_id',$year_id)->OrderBy('niveau_id','desc')->get();

        return response()->json(['data'=>$schooling_data]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(CreateSchoolingRequest $request)
    {
      $validated=$request->validated();
      $schooling=new Schooling;
      $etablissement=Etablissement::latest()->first();

      $inserting_data=[];
      foreach($validated['niveau_id_schooling'] as $key=>$value)
      {
        $inserting_data[]=[
         'etablissement_id'=>$etablissement->id,
         'niveau_id'=>$value,
         'school_year_id'=>$validated['schooling_school_year'],
         'amount'=>$validated['schooling_amount'][$key],
         'description'=>" ",
         'created_at'=>now(),
         'updated_at'=>now()
        ];

      // return response()->json(['status'=>200,'message'=>'Vos Données ont été enregistrées avec succès ']);
      }
      $schooling::insert($inserting_data);

      return response()->json(['status'=>200,'message'=>'Vos Données ont été enregistrées avec succès ']);

    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Voici le code de la vue du formulaire 
en fait c'est la ligne de champ qui va constituer les input array de mon form 

input+="<tr>";
input+="<td>"+cpt+"</td>";
input+="<td>"+value.niveau.designation+"<input type='hidden' name='niveau_id_schooling[]' value='"+value.niveau_id+"' class='niveau_id_schooling'></td>";
input+="<td><input type='text' name='schooling_amount[]' value='"+value.amount+"' class='form-control schooling_amount'></td>";
input+="<td><button class='btn' onclick='delete_line($(this))'><i class='fa-solid fa-trash'></i></button></td>";
input+="</tr>";
Entourez votre code en utilisant "```" pour bien le mettre en forme. (ne copiez pas trop de code)

Ce que je veux
Je souhaite pouvoir afficher la donnee dans les messages de ma request pour faire savoir à l'utilisateur que la valeur concernée existe dejà

Ce que j'obtiens
Cependant j'obtiens toujours le message d'erreur array to string conversion

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

5 réponses


Il semble que le problème réside dans la façon dont vous essayez de personnaliser les messages d'erreur pour les champs de tableau dans votre classe CreateSchoolingRequest. Vous avez utilisé la clé niveau_id_schooling.*.unique dans la méthode messages(), mais cela ne semble pas fonctionner correctement.

Voici une suggestion pour résoudre ce problème:

  1. Modifier les règles de validation pour utiliser la syntaxe de tableau dans rules():

    Changez la règle de validation unique pour utiliser la syntaxe de tableau afin de spécifier le champ unique pour chaque élément du tableau. Vous pouvez le faire de la manière suivante:

    'niveau_id_schooling.*' => [
       'required',
       Rule::unique('schoolings', 'niveau_id')
           ->where('school_year_id', $this->schooling_school_year)
    ],

    Cela permettra de gérer correctement la validation unique pour chaque élément du tableau.

  2. Modifier le message d'erreur dans messages():

    Vous pouvez maintenant personnaliser le message d'erreur pour la validation unique en utilisant la clé correcte:

    'niveau_id_schooling.*.unique' => 'Le niveau :value est déjà ajouté',

    Notez que :value sera automatiquement remplacé par la valeur spécifique du champ.

  3. Mise à jour complète de la classe CreateSchoolingRequest:

    Voici comment pourrait ressembler la classe mise à jour:

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Validation\Rule;
    use Illuminate\Foundation\Http\FormRequest;
    
    class CreateSchoolingRequest extends FormRequest
    {
       // ... autres méthodes
    
       public function rules()
       {
           return [
               'schooling_school_year' => 'required',
               'niveau_id_schooling' => 'required|array',
               'niveau_id_schooling.*' => [
                   'required',
                   Rule::unique('schoolings', 'niveau_id')
                       ->where('school_year_id', $this->schooling_school_year)
               ],
               'schooling_amount' => 'required|array',
               'schooling_amount.*' => 'required',
           ];
       }
    
       public function messages()
       {
           return [
               'schooling_school_year.required' => 'L\'année académique est obligatoire',
               'niveau_id_schooling.*.required' => 'Vous devez ajouter au moins une ligne de données pour le niveau',
               'schooling_amount.*.required' => 'Vous devez ajouter une ligne de montant pour enregistrer',
               'niveau_id_schooling.*.unique' => 'Le niveau :value est déjà ajouté',
           ];
       }
    
       // ... autres méthodes
    }

Assurez-vous de mettre à jour votre classe CreateSchoolingRequest en fonction de ces suggestions, puis réessayez d'envoyer le formulaire. Cela devrait résoudre le problème de la conversion de tableau en chaîne.

Merci mais après mise a jour du code je me rends compte :value est vue comme une chaine de caractères , c'est-a-dire qu'il affiche la valeur :value a déjà été ajouté

voici le code

<?php

namespace App\Http\Requests;

use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;

class CreateSchoolingRequest extends FormRequest
{
/**

  • Determine if the user is authorized to make this request.
  • @return bool
    */
    public function authorize()
    {
    return true;
    }

    /**

  • Get the validation rules that apply to the request.
  • @return array
    */
    public function rules()
    {

    // 'niveau_id_schooling.*'=>'required|distinct',
    return [
        //
        'schooling_school_year'=>'required',
        'niveau_id_schooling'=>'required|array',
        'niveau_id_schooling.*'=>['required','distinct',Rule::unique('schoolings','niveau_id')
        ->where('school_year_id',$this->schooling_school_year)],     
        'schooling_amount'=>'required|array',
        'schooling_amount.*'=>'required',
    
    ];

    }

    public function messages()
    {

    return [
        'schooling_school_year.required'=>'l\'année Academique est obligatoire ',
        'niveau_id_schooling.*.required'=>'Vous devez ajouter au moins une ligne de données pour le niveau ',
        'schooling_amount.*.required'=>'Vous devez ajouter une ligne de montant pour enregistrer',
        'niveau_id_schooling.*.unique'=>' le niveau :value  est dejà ajouté ',
    
    ];

    }

    public function failedValidation(Validator $validator)
    {
    $response= response()->json([
    'success' => false,
    'message' => 'Ops! Some errors occurred',
    'errors' => $validator->errors()
    ]);

    throw(new ValidationException($validator,$response));

    }
    }

j'utilise laravel 8.83.27

'niveau_id_schooling.*' => [
    'required',
    'distinct',
    Rule::unique('schoolings', 'niveau_id')
        ->where('school_year_id', $this->schooling_school_year)
        ->ignore($this->route('ton_parametre_de_route'), 'ta_colonne_clé_primaire')
],

Dans ce cas, remplace 'ton_parametre_de_route' par le nom du paramètre dans ta route (habituellement l'ID de la ressource que tu modifies) et 'ta_colonne_clé_primaire' par le nom de la colonne clé primaire dans ta table (id par défaut).

Voici comment ça pourrait ressembler dans ton cas (si ta route utilise l'ID de la ressource) :

'niveau_id_schooling.*' => [
    'required',
    'distinct',
    Rule::unique('schoolings', 'niveau_id')
        ->where('school_year_id', $this->schooling_school_year)
        ->ignore($this->route('schooling'), 'id')
],

Assure-toi de remplacer 'schooling' par le nom réel de ta route utilisée pour cette ressource. Cela devrait résoudre le problème avec la substitution :value dans le message d'erreur.

j'essaie de proposer en fonction de ce que je comprend mais je ne suis sur de rien evidemment