Search code examples
phparrayslaravellaravel-7laravel-controller

Laravel7 How to custom the RegisterController to save multiple data when user selected


I am a newbie in Laravel and I need your help.

I'm using the Laravel 7. I have 3 tables in my database.

  1. User to save the registered users
  2. Categories to show in the front-end that I provided for them to choose (multiple)
  3. Vendor_Cat that I collecting the user_id and category_id after the user registered

Here are my Models


public function users(){
        return $this->BelongsToMany(User::class);
    }

public function categories(){
        return $this->BelongsToMany(Categories::class);
    }

This one below is my VendorCategories Model

protected $fillable = [
    'category_id',
    'vendor_id'
];

And this is the Laravel RegisterController

   protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'tel' => $data['tel'],
            'lineid'=> isset($data['lineid']) ? $data['lineid'] : null,
        ]);

My Front-End code (Just Categories for a user to choose)


                        @if($categories->count()>0)
                        <div class="form-row">
                            <label class="form-row-inner">
                            <select class="selectpicker col-sm-12 md-12" id="selectpicker"  name="categories[]" multiple data-live-search="true" data-selected-text-format="count" data-count-selected-text="Selected Categories({0})" title="Choose your catories" aria-expanded="false" aria-haspopup="true" required>
                            @foreach ($categories as $categories)
                            <option class="com-sm-4 md-4" aria-expanded="false" value="{{$categories->id}}"
                                @if (isset($user))
                                  @if($user->hasCat($catgories->id))
                                      selected
                                  @endif
                                @endif
                                ><strong>{{Str::limit($categories->name,51)}}</strong></option>
                            @endforeach
                            </select>
                            @error('category_id')
                            <span class="invalid-feedback-detail" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                            @enderror
                        </div>
                        @endif

Full Register Form Code

                <form class="form-detail col-xs-12 sm-12" action="{{ route('register') }}" method="post">
                    @csrf
                    <div class="tabcontent" id="sign-up">
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="text" id="full_name" class="input-text @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
                                <span class="label">Full Name</span>
                                @error('name')
                                <span class="invalid-feedback-detail" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                                  <span class="border"></span>
                            </label>
                        </div>
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="text" id="your_email" class="input-text @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
                                <span class="label">E-Mail</span>
                                @error('email')
                                <span class="invalid-feedback-detail" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                                <span class="border"></span>
                            </label>
                        </div>
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="text" id="yournumber" class="input-text @error('tel') is-invalid @enderror" name="tel" required autocomplete="new-password">
                                <span class="label">Telephone Number</span>
                                @error('tel')
                                <span class="invalid-feedback-detail" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                                <span class="border"></span>
                            </label>
                        </div>
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="password" name="password" id="password" class="input-text @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
                                <span class="label">Password</span>
                                @error('password')
                                <span class="invalid-feedback-detail" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                                <span class="border"></span>
                            </label>
                        </div>
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="password" id="comfirm_password" class="input-text" name="password_confirmation" required autocomplete="new-password">
                                <span class="label">Confirm Password</span>
                                <span class="border"></span>
                            </label>
                        </div>
                        <div class="form-row">
                            <label class="form-row-inner">
                                <input type="text" id="comfirm_password_1" class="input-text @error('lineid') is-invalid @enderror" name="lineid" required autocomplete="new-password">
                                <span class="label">Line Id</span>
                                @error('lineid')
                                <span class="invalid-feedback-detail" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                                <span class="border"></span>
                            </label>
                        </div>
                        @if($categories->count()>0)
                        <div class="form-row">
                            <label class="form-row-inner">
                            <select class="selectpicker col-sm-12 md-12" id="selectpicker"  name="categories[]" multiple data-live-search="true" data-selected-text-format="count" data-count-selected-text="หมวดหมู่ที่เลือก ({0} หมวดหมู่)" title="เลือกหมวดหมู่ที่ให้บริการ" aria-expanded="false" aria-haspopup="true" required>
                            @foreach ($categories as $categories)
                            <option class="com-sm-4 md-4" aria-expanded="false" value="{{$categories->id}}"
                                @if (isset($user))
                                  @if($user->hasCat($catgories->id))
                                      selected
                                  @endif
                                @endif
                                ><strong>{{Str::limit($categories->name,51)}}</strong></option>
                            @endforeach
                            </select>
                            @error('category_id')
                            <span class="invalid-feedback-detail" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                            @enderror
                        </div>
                        @endif
                     <div class="form-row-last">
                        <input type="submit" name="register" class="register">
                     </div>
                    </div>
                </form>

If I want to save the category Ids that I use @foreach to show in the Register Form after the users selected. What should I do?

This is the thing that I have tried before

protected function create(array $data){
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'tel' => $data['tel'],
            'lineid'=> isset($data['lineid']) ? $data['lineid'] : null,
        ]);

    $vendor_cat = VendorCat::create([
            'category_id' => $data['category'],
            'vendor_id' => $user->id
        ]);

    return $user;
}

Here is the explanation image Click Here

Thank you,

p.s. sorry for my bad English.


Solution

  • Add registered method in your RegisterController, to override the register method from your RegistersUsers trait. Also add use Illuminate\Http\Request; in your RegisterController.

    protected function create(array $data)
    {
            // .... your create method in RegisterController
    }
    protected function registered( Request $request, $user )
    {
        VendorCat::create([
                'category_id' => $request['category'],
                'vendor_id' => $user->id
            ]);
    }
    

    EDIT:

    as you are getting categories as array, you can simply store all the keys separated by commas, or store them separately for each values,

    To store them separately,

    foreach($request['categories'] as $category){
        VendorCat::create([
                'category_id' => $category,
                'vendor_id' => $user->id
            ]);
    }
    

    It will create 3 columns for 3 different category_id with same vendor_id.

    To store using commas,

    VendorCat::create([
                'category_id' => is_array($request['categories']) ? implode(",",$request['categories']) : $request['categories'],
                'vendor_id' => $user->id
            ]);