1

I have registration form generated through php artisan make:auth command in Laravel project. I want to customize it a bit by adding functionality that user can select his/her gender when registering. I made genders table that has genders column with two values Man and Woman and also added gender_id column in users table. I hasMany relationship but when I try and register user he is registered but gender_id columns is still NULL. I don't know where the mistake is. Any help is appreciated. Here is my code.

RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Gender;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    protected $redirectTo = '/home';


    public function __construct()
    {
        $this->middleware('guest');
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'genders' => ['required', 'string', 'max:255'],
            /* 'gender_id' => 'required|exists:mysql.genders,id', */
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'age' => ['required', 'integer', 'min:18'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    protected function create(array $data)
    {
        $genders = Gender::where('genders', request()->genders)->get()->pluck('id')->first();

        $user = User::create([
            'genders_id' => $genders,
            'name' => $data['name'],
            'email' => $data['email'],
            'age' => $data['age'],
            'password' => Hash::make($data['password']),
        ]);

        return $user;
    }
}

register.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Register') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('register') }}">
                        @csrf




                        <div class="form-group row">
                            <label for="genders" class="col-md-4 col-form-label text-md-right">{{ __('Genders') }}</label>
                            <div class="col-md-6">


 <select id="genders" class="form-control @error('genders') is-invalid @enderror" name="genders" value="{{ old('genders') }}" required autocomplete="genders">


                                    <option value="Woman">Woman</option>
                                    <option value="Man">Man</option>
                                </select>
                                @error('genders')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>




                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="age" class="col-md-4 col-form-label text-md-right">{{ __('Age') }}</label>

                            <div class="col-md-6">
                                <select id="age" class="form-control @error('age') is-invalid @enderror" name="age" value="{{ old('age') }}" required autocomplete="age">
                                    <option value="18">18</option>
                                    <option value="19">19</option>
                                    <option value="20">20</option>
                                    <option value="21">21</option>
                                </select>
                                @error('age')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Register') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

User.php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
    protected $fillable = [
        'gender_id', 'name', 'email', 'password', 'age',
    ];

    /**
    * The attributes that should be hidden for arrays.
    *
    * @var array
    */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
    * The attributes that should be cast to native types.
    *
    * @var array
    */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function genders()
    {
        return $this->belongsTo(Gender::class);
    }
}
5
  • Have you checked if Gender::where('genders', request()->genders)->get()->pluck('id')->first() actually returns something? Commented Nov 28, 2019 at 15:10
  • Check also if the gender_id is passed on the request Commented Nov 28, 2019 at 15:11
  • @Jerodev Yes. It returns id from genders table where genders( id = 1 for man and id = 2 for woman) depends on what is clicked Commented Nov 28, 2019 at 15:11
  • @LucaRossi It is possible that it isn't now that I see. How can I check and what can I do if it isn't??? Commented Nov 28, 2019 at 15:13
  • @LucaRossi When I dump $user in controller I don't see gender_id in attributes array if that is what you mean. What is wrong with that, how can it be fixed? Commented Nov 28, 2019 at 15:15

1 Answer 1

1

Eloquent relationship may not work if the column is not set properly.

In the migration the type of the column gender_id must be a unsignedBigInteger

I suggest you also to rename the function in your User.php model to gender instead of genders

I saw you use gender_id when you create your user:

$user = User::create([
            'genders_id' => $genders,
            'name' => $data['name'],
            'email' => $data['email'],
            'age' => $data['age'],
            'password' => Hash::make($data['password']),
]);

This will actually not work because Laravel will search for gender_id in the table

If you want to keep genders_id you can set your hasMany like this: return $this->hasMany(User::class, 'genders_id');

Sign up to request clarification or add additional context in comments.

3 Comments

It still doesn't work. Do I have to use relations at all? Is my input in blade ok? Can you help?
If you have change the migration file make sure you migrate again!
Yes it does. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.