2017-05-26 12 views
0

私は現在、ユーザーとクライアントを格納する2つのテーブルを持っています。クライアントは、1対1の関係でユーザーに関連しています。Laravelは、外国の関係を持つモデルを作成して更新します

私は現在

public function store(Request $request) 
    { 
     $requestData = $request->all(); 

     $user = new User(); 
     $user->fill($requestData); 
     $user->save(); 

     $client = new Client; 
     $client->fill($requestData); 
     $client->user()->associate($user); 
     $client->save(); 

     return response()->json($client->toArray(), 201, ['id' => $client->id]); 
    } 

    public function update(Request $request, $id) 
    { 
     try { 
      $client = Client::findOrFail($id); 
      $user = User::findOrFail($client->fk_user); 
     } catch (ModelNotFoundException $e) { 
      return response()->json([ 
       'error' => [ 
        'message' => 'Client not found', 
       ] 
      ], 404); 
     } 

     $requestData = $request->all(); 

     $user->fill($requestData); 
     $user->save(); 
     $client->fill($requestData); 
     $client->user()->associate($user); 
     $client->save(); 

     return response()->json($client->toArray(), 200); 
    } 

は別のモデルとして、ユーザーとクライアントの両方で動作することを避けるために、これをリファクタリングする方法はあります...保存・更新そうのようなモデルを、それはむしろ不格好感じています。おそらくクライアントを埋める方法があり、親のユーザーモデルを埋めるのでしょうか?

おかげさまで、感謝します。

+1

たぶん、ユーザーとクライアントを格納例えば、自分の方法に抽出によりロジックの一部を開始します。その後、あなたはまた、それらを再利用する能力を得る。 また、いくつかのレスポンス・メソッドを設定して、ストア/更新メソッドにすべてのレスポンス・タイプとステータス・コード・ジャンクを持つ必要はありません。 –

+0

ああ大丈夫@IsakBerglindに感謝しますが、クライアントを満たすためのLaravelの方法はありませんし、この場合、ユーザーはいっぱいですか? – liamjnorman

+1

これをクライアントモデルに追加し、要求データを送信して保存することができます。例:$ client-> saveAndAssociateUser($ requestData); –

答えて

1

私はあなたにリファクタリングのインスピレーションを与えました。これは必ずしも「正しい」方法ではありませんが、あなたが好きなものを選ぶことができます。

注!私は実際にコードをテストしていない、おそらく完全な構文エラーです。私はそれをいくつかのアイデアを示すためにハッキングしました。論理の一部は、ユーザーを関連付けるように、私は想像をクライアントモデルに配置しました。エラー処理はapp/Exceptions/Handler.phpで行われます。

は、あなたがそれのいくつかを使用することができます願っています:)

private function saveUser($args, $user = null) {   
    $user = $user ?: new User(); 
    $user->fill($args); 
    $user->save(); 
    return $user; 
} 

private function saveClient($args, $client= null) { 
    $client = $client ?: new Client; 
    $client->fill($args); 
    $client->save(); 
    return $client; 
} 

private function respondCreated($data = []) { 
    return $this->respond($data, 201, "created"); 
} 

private function respond($data = [], $statusCode = 200, $message = "ok") { 
    $response = [ 
     "message" => $message, 
     "data" => $data 
    ]; 
    return response()->json($response, $statusCode); 
} 

public function store(Request $request) 
{ 
    $user = $this->saveUser($request->all()); 
    $client = $this->saveClient($request->all()); 
    $client->saveUser($user); 

    return $this->respondCreated($client); 
} 

public function update(Request $request, $id) 
{ 

    $client = $this->saveClient($request->all(), $client::findOrFail($id)); 
    $this->saveUser($request->all(), $client->fk_user); 

    return $this->respond($client); 
} 
+0

うわー、ありがとう!多くの助けになります! – liamjnorman

関連する問題