2016-12-05 11 views
1

私はlaravelで2種類のユーザーを作ろうとしています。私は2つのテーブルを持っています。私は定義されたレジスタビューとコントローラをlaravelから使いたいですが、新しいユーザを登録すると、最初のテーブルにのみ保存されます。新しいタイプのユーザーをLaravel 5.3に登録する

問題がありますurl('/register')ここから<form class="form-horizontal" role="form" method="POST" action="{{ url('/register') }}" id="form_reg1">私は2つのフォームを使用しているので、投稿要求を送信するためにこのURLを編集する方法がわかりません。ユーザーのタイプ。

これは最初のコントローラです:

<?php 

namespace App\Http\Controllers\Auth; 

use App\User; 
use Validator; 
use App\Http\Controllers\Controller; 
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; 

    /** 
    * Where to redirect users after login/registration. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/index'; 

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

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'name' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|min:6|confirmed', 
      'first_name' => 'required|max:255', 
      'last_name' => 'required|max:255', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function create(array $data) 
    { 
     return User::create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
      'first_name' => $data['first_name'], 
      'last_name' => $data['last_name'], 
     ]); 
    } 
} 

、これは、第二のコントローラです:

<?php 

namespace App\Http\Controllers\Auth; 

use App\Merchant; 
use Validator; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\RegistersUsers; 

class RegisterMerchantController 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; 

    /** 
    * Where to redirect users after login/registration. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/index'; 

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

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'name' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|min:6|confirmed', 
      'first_name' => 'required|max:255', 
      'last_name' => 'required|max:255', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function create(array $data) 
    { 
     return Merchant::create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
      'first_name' => $data['first_name'], 
      'last_name' => $data['last_name'], 
     ]); 
    } 
} 

ので、任意のアイデア?

+0

あなたのお手伝いができるように、あなたの 'RegisterController'を投稿できますか? – melanholly

+0

あなたのコードはここに入力してください –

+0

@melanholly質問を編集します – Devmasta

答えて

2

この問題にはいくつかの方法があります。それらのうちの1つは、register.blade.phpのユーザータイプの非表示フィールドを使用してフィールドに基づいて、入力を検証するためにレジスタコントローラにログインすることです。

<input type="hidden" name="user_type" id="user_type" value="user"> 

あなたは、例えば

<select id="user_type" name="user_type"> 
    <option value="user">User</option> 
    <option value="merchant">Merchant</option> 
</select> 

のような選択を使用することができますRegisterController

protected function validator(array $data) 
{ 
    return Validator::make($data, [ 
     'name' => 'required|max:255', 
     'email' => 'required|email|max:255|unique:users', 
     'password' => 'required|min:6|confirmed', 
     'first_name' => 'required|max:255', 
     'last_name' => 'required|max:255', 
     'user_type' =>'required|in:user,merchant' 
    ]); 
} 

/** 
* Create a new user instance after a valid registration. 
* 
* @param array $data 
* @return User|Merchant 
*/ 
protected function create(array $data) 
{ 
    if ($data['user_type'] == "merchant") { 
     return Merchant::create([ 
      'name'  => $data['name'], 
      'email'  => $data['email'], 
      'password' => bcrypt($data['password']), 
      'first_name' => $data['first_name'], 
      'last_name' => $data['last_name'], 
     ]); 
    } else { 
     return User::create([ 
      'name'  => $data['name'], 
      'email'  => $data['email'], 
      'password' => bcrypt($data['password']), 
      'first_name' => $data['first_name'], 
      'last_name' => $data['last_name'], 
     ]); 
    } 
} 
0

あなたが同じテーブルにユーザーを保存し を使用する場合、それは良いだろうそれらの両方を区別するためにpolymorphic relationships。このテクニック を認証すると、 というユーザーを1つのテーブル(users)を参照することで認証できます。

だからあなたのテーブル構造は次のようになります: -

- users 
    - id 
    - owner_id 
    - owner_type 
    - email 
    - password 
    - token 
    - ... 

- clients 
    - id 
    - name 
    - gender 
    - mobile 
    - ... 

- merchants 
    - id 
    - name 
    - gender 
    - mobile 
    - ... 

あなたのモデルのようになりますClientUser & Merchant:あなたのHTMLフォーム内で今

class User extends Model 
{ 
    public function owner() 
    { 
     return $this->morphTo(); 
    } 
} 

class Client extends Model 
{ 
    public function user() 
    { 
     return $this->morphOne(User::class, 'owner'); 
    } 
} 

class Merchant extends Model 
{ 
    public function user() 
    { 
     return $this->morphOne(User::class, 'owner'); 
    } 
} 

、あなたがすることができますselectオプションを追加して、作成するユーザーのタイプを選択します(またはhidden fieldsのヘルプを利用できます)。 )それを実装、私はデモの目的のために選択オプションを使用しています:

class RegisterController extends Controller 
{ 

    public function register() 
    { 
     // You should use validator here to validate your inputs here... 
     $inputs = request()->except('_token'); 

     if($inputs['type'] == 1) { 
      $profile = Client::create(array_only($inputs, ['mobile, 'gender', 'name'])); 
     } else { 
      $profile = Merchant::create(array_only($inputs, ['mobile, 'gender', 'name'])); 
     } 

     $user_inputs_arr = array_only($inputs, ['email', 'password']); 
     $user_inputs_arr['password'] = bcrypt($inputs['password']); 

     $user = $profile->user()->create($user_inputs_arr); 
     // Hence your client is registered successfully... 
    } 

} 
<form action="{{ route('register_route_name') }}" method="POST"> 
    {{ csrf_field() }} 
    <select name="type"> 
     <option disabled> Select Type of User </option> 
     <option value="1"> Client </option> 
     <option value="2"> Merchant </option> 
    </select> 

    <input type="text" name="name"> 
    <input type="text" name="mobile"> 

    <input type="radio" name="gender" value="0"> Male 
    <input type="radio" name="gender" value="1"> Female 

    <input type="email" name="email"> 
    <input type="password" name="password"> 

    <input type="submit" value="Register"> 

</form> 

今すぐあなたのコントローラ内のあなたは、このようなために買ってあげるの種類に応じて、ユーザーを追加します

希望します。

+0

クライアントモデルが所有者モデルである理由、私はそのユーザーモデルが所有者でなければならないと思いますか? – Devmasta

+0

私の理解によると、クライアントは 'User'と' Merchant'の共通モデルです。それは完全にあなた次第です。あなたの実現可能性に応じてそれを変更することができます。これには厳しいルールはありません:D –

+0

いいえ、私の質問を理解していない、私は、1つのユーザーテーブルを持つのではなく、2種類のユーザー、クライアントとマーチャント(クライアントとマーチャントが2つの異なるテーブルになる)を持っていたい。だから私はあなたが困っている理由を答えます。 – Devmasta

関連する問題