How can I update a table column when a user selects an option in a dropdown list during registration?

Viewed 213

I'm quite new to Laravel, I'm using Laravel 7 and Mysql database. I have a registration form that has a dropdown select field that pulls a list of data from mysql database. The list displays well to the user but when an option is clicked, it does not update the column in my database table once a user clicks "Register" button. The column is a foreign key because there is a one-to-one relationship between my two tables i.e "Clients" table and "Categories" table. The column name is "category_id" (This is a foreign key).

How can I update this column with an ID (from "Categories" Table) when a user selects an option?

RegisterController:

<?php

namespace App\Http\Controllers\Auth\Client;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Client;
use App\Models\Category;
use App\Models\Role;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;

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;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    // Showing a Registration Form to User

    public function create()
    {
        
        $categories = Category::all();
      
        
        return view('auth.client.register',compact('categories'));
    }


    // Validating the User

    public function store(Request $request)
    {
        $request->validate([
            'first_name'            => 'required|string|max:255',
            'last_name'             => 'required|string|max:255',
            'telephone_number'      => 'required|digits:10',
            'email'                 => 'required|string|email|max:255|unique:users','regex:/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,6}$/',
            'password'              => 'required|string|min:6|confirmed',
            'password_confirmation' => 'required',
        ]);

    // Creating the Client - Client is inserted in both clients and users tables

        $client = Client::create([
                    'first_name'        => $request->first_name,
                    'last_name'         => $request->last_name,
                    'telephone_number'  => $request->telephone_number,
                    'email'             => $request->email,
                    'password'          => Hash::make($request->password),
                    'category_id'       => $request->category_id,

        ]);

        $user = User::create([
                    'first_name'        => $request->first_name,
                    'last_name'         => $request->last_name,
                    'telephone_number'  => $request->telephone_number,
                    'email'             => $request->email,
                    'password'          => Hash::make($request->password),


    ]);

        $client->update(['user_id' => $user->id]);
        

        $user->email_verified_at = Carbon::now();
        $user->is_email_verified = 1;
        $user->is_active = 1;
        $user->set_password = true;

        $ownerId = $client->id;
        $ownerType = Client::class;
        $user->update(['owner_id' => $ownerId, 'owner_type' => $ownerType]);
        
        $user->assignRole('Client');

       

        return redirect('dashboard');
    }
      
}

Categories Model:

<?php

namespace App\Models;

use Eloquent as Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;

class Category extends Model
{
    /**
     * Validation rules.
     *
     * @var array
     */
    public static $rules = [
        'name' => 'string|required|unique:categories,name',
        'color' => 'string|required',
    ];
    public $table = 'categories';
    public $fillable = [
        'name', 
        'color',
        'description'
    ];
    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'id'   => 'integer',
        'name' => 'string',
    ];
}

Relationship in my Clients Model:

/**
     * @return BelongsTo
     */
    public function category()
    {
        return $this->belongsTo(Category::class);
    }

Select field in my register blade file:

<div class="col-sm-6 col-lg-6 col-md-12">
            <label for="category">Category</label><span class="text-danger">*</span>
                <select class="custom-select" id="category_id" name="category_id">
                @foreach($categories as $category )
                <option value="{{ $category->id }}">{{ $category->name }}</option>
                @endforeach
                </select>
                </div>

enter image description here

enter image description here

enter image description here

1 Answers

couple of quick things to update and it should work.

First of all you don't seem to be storing the category inside the clients table.

So change the relevant code to this inside your controller:

$client = Client::create([
    'first_name'        => $request->first_name,
    'last_name'         => $request->last_name,
    'telephone_number'  => $request->telephone_number,          
    'email'             => $request->email,
    'password'          => Hash::make($request->password),
    'category_id'       => $request->category_id,
]);

Finally, you'll need to update your select element to have a name of category_id too.

<div class="col-sm-6 col-lg-6 col-md-12">
    <label for="category">Category</label><span class="text-danger">*</span>
    <select class="custom-select" id="category_id" name="category_id">
        @foreach($categories as $category )
            <option value="{{ $category->id }}">{{ $category->name }}</option>
        @endforeach
    </select>
</div>
///
Related