Laravel 创建和更新具有外部关系的模型

Posted

技术标签:

【中文标题】Laravel 创建和更新具有外部关系的模型【英文标题】:Laravel create and update model with foreign relationship 【发布时间】:2017-10-27 19:56:24 【问题描述】:

我目前有两个表,分别存储用户和客户。客户端与用户以一对一的关系关联。

我目前正在像这样存储和更新模型,但感觉相当笨重......

 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);
    

有没有办法对其进行重构,以避免将用户和客户作为单独的模型进行工作。有没有办法填充一个客户端,然后填充父用户模型?

只是想知道,谢谢!

【问题讨论】:

可能先提取一些逻辑到自己的方法中,例如存储用户和客户端。然后,您还可以获得重用它们的能力。您还可以设置一些响应方法,这样您就不需要在存储/更新方法中包含所有响应类型和状态代码垃圾。 嗯,好的,谢谢@IsakBerglind,但是在这种情况下,Laravel 没有办法填充客户端然后填充用户吗? 您可以将其添加到客户端模型上,向其发送请求数据并保存。例如:$client->saveAndAssociateUser($requestData); 另外,当用户期望一个 json 响应时,检查这个以处理异常,这样你就可以摆脱那个 trycatch ***.com/questions/28944097/… 谢谢,请随时添加答案,我会接受! 【参考方案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);

【讨论】:

以上是关于Laravel 创建和更新具有外部关系的模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系

使用 laravel,我如何创建一个将更新一对多关系的视图?

在 Laravel 中模拟具有关系的模型

在 Laravel 中模拟具有关系的模型

Laravel 获取关系具有价值的模型集合

Laravel 获取所有具有关系的模型