Php Laravel创建并更新具有外部关系的模型
我目前有两个表,即存储用户和客户端。客户机以一对一的关系与用户相关 我现在正在存储和更新这样的模型,但它感觉相当笨拙Php Laravel创建并更新具有外部关系的模型,php,laravel,laravel-5,foreign-key-relationship,Php,Laravel,Laravel 5,Foreign Key Relationship,我目前有两个表,即存储用户和客户端。客户机以一对一的关系与用户相关 我现在正在存储和更新这样的模型,但它感觉相当笨拙 public function store(Request $request) { $requestData = $request->all(); $user = new User(); $user->fill($requestData); $user->save();
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);
}
有没有一种方法可以重构它,以避免将用户和客户机作为单独的模型来使用。是否有一种方法可以填充客户机,进而填充父用户模型
只是想知道,谢谢 我给了你一些重构的灵感。这不一定是“正确”的方式,但也许你可以选择你喜欢的东西 注意!我还没有实际测试代码,它可能充满了语法错误。我只是把它砍下来展示一些想法。我已经将一些逻辑(比如关联用户)放在了客户机模型中。错误处理发生在app/Exceptions/Handler.php中 希望您能使用它:)
可以从提取一些逻辑到他们自己的方法开始,例如存储用户和客户机。然后您还可以重用它们。您还可以设置一些响应方法,这样您就不需要在存储/更新方法中包含所有的响应类型和状态代码垃圾。啊,好的,谢谢@IsakBerglind,但是在Laravel中没有办法填充客户机,然后在这种情况下填充用户吗?或者,您可以在客户机模型中添加这些,向其发送请求数据并保存它。例如:$client->saveAndAssociateUser($requestData);另外,当用户需要json响应时,请检查此项以处理异常,这样您就可以摆脱trycatch了。谢谢,请随意添加答案,我会接受!
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);
}