phplaravelregistration

Laravel always sets the default value


I am trying to do registration with user profile picture upload.(I am forced to do it this way) I created the migration like this:

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('nom');
        $table->string('prenom');
        $table->string('type')->default('visiteur');
        $table->boolean('confirme')->default(false);
        $table->string('email')->unique();
        $table->string('password');
        $table->string('photo_url')->default('default_photo_profile.jpg');
        $table->rememberToken();
        $table->timestamps();
    });

the create function :

$request = request();


if ($request->hasFile('photo')) {
            $file = $request->file('photo');
            $fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension();
            $path = $request->file('photo')->storeAs('images', $fullname);
        }

        return User::create([
            'nom' => $data['nom'],
            'prenom' => $data['prenom'],
            'email' => $data['email'],
            'photo_url' => $fullname,
            'password' => Hash::make($data['password']),
        ]);
  }

and the form for the file field is like this:

<div class="form-group">
    <label for="photo_url">Photo profile</label>
    <input type="file" name="photo" class="form-control-file" id="photo_url">
</div>

everything is working fine except the photo_url field, it always sets the default value in the migration and not the value I set in the create function. $fullname is initiated and already declared.

the entire form :

<form method="POST" action="{{ route('register') }}" aria-label="{{ __('Register') }}"  enctype="multipart/form-data">
                    @csrf

                    <div class="form-group row">
                        <label for="nom" class="col-md-4 col-form-label text-md-right">Nom</label>

                        <div class="col-md-6">
                            <input id="nom" type="text" class="form-control{{ $errors->has('nom') ? ' is-invalid' : '' }}" name="nom" value="{{ old('nom') }}" required autofocus>

                            @if ($errors->has('nom'))
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $errors->first('nom') }}</strong>
                                </span>
                            @endif
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="prenom" class="col-md-4 col-form-label text-md-right">Prénom</label>

                        <div class="col-md-6">
                            <input id="prenom" type="text" class="form-control{{ $errors->has('prenom') ? ' is-invalid' : '' }}" name="prenom" value="{{ old('prenom') }}" required autofocus>

                            @if ($errors->has('prenom'))
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $errors->first('prenom') }}</strong>
                                </span>
                            @endif
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="email" class="col-md-4 col-form-label text-md-right">Email</label>

                        <div class="col-md-6">
                            <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required>

                            @if ($errors->has('email'))
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $errors->first('email') }}</strong>
                                </span>
                            @endif
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="password" class="col-md-4 col-form-label text-md-right">Mot de pass</label>

                        <div class="col-md-6">
                            <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>

                            @if ($errors->has('password'))
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $errors->first('password') }}</strong>
                                </span>
                            @endif
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="password-confirm" class="col-md-4 col-form-label text-md-right">Mot de pass confirmation</label>

                        <div class="col-md-6">
                            <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="photo_url">Photo profile</label>
                        <input type="file" name="photo" class="form-control-file" id="photo_url">
                    </div>
                    <div class="form-group row mb-0">
                        <div class="col-md-6 offset-md-4">
                            <button type="submit" class="btn btn-primary">
                                Envoyer
                            </button>
                        </div>
                    </div>
                </form>

What is the problem?


Solution

  • so according to your code in your model you have to add the photo_url in $fillable array like below.

    $fillables = ['nom','prenom','type','confirme','email','password','photo_url'];
    

    okay now there are 3 ways to do it with $fillable is first way and you are doing it right now.

    2nd way:

       if ($request->hasFile('photo')) { 
        $file = $request->file('photo'); 
        $fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension(); 
        $path = $request->file('photo')->storeAs('images', $fullname); 
       } 
       else 
       { 
         $fullname = "default_photo_profile.jpg";  
       } 
    
    return User::create([
                'nom' => $data['nom'],
                'prenom' => $data['prenom'],
                'email' => $data['email'],
                'photo_url' => $fullname,
                'password' => Hash::make($data['password']),
            ]);
    

    and in your migration change this $table->string('photo_url')->default('default_photo_profile.jpg'); to $table->string('photo_url');

    3rd way:

    $fullname = "default_photo_profile.jpg";
    
    if ($request->hasFile('photo')) {
                $file = $request->file('photo');
                $fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension();
                $path = $request->file('photo')->storeAs('images', $fullname);
    
     return User::create([
                'nom' => $data['nom'],
                'prenom' => $data['prenom'],
                'email' => $data['email'],
                'photo_url' => $fullname,
                'password' => Hash::make($data['password']),
            ]);
            }
    
            return User::create([
                'nom' => $data['nom'],
                'prenom' => $data['prenom'],
                'email' => $data['email'],
                'photo_url' => $fullname,
                'password' => Hash::make($data['password']),
            ]);
      }
    

    okay these are the ways to do it. i would prefer first and second way 3rd one is lengthy.

    Note: for 2nd and 3rd case you have to change your migration from this $table->string('photo_url')->default('default_photo_profile.jpg'); to $table->string('photo_url'); Hope you get it.