2017-05-26 36 views
0

我目前有两个表,即存储用户和客户端。客户与用户以一对一的关系关联。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