在 Laravel 中保存多态关系
Saving Polymorphic Relations in Laravel
我目前在 phone 号码和联系人或组织之间存在多态关系。我正在使用 morphMap 将父关系命名空间模型的名称分别更改为联系人或组织。
目前,当我想为组织或联系人创建新的 phone 号码时,我传递了两个 URL 参数,parent_id=$record_id 和 parent_type=联系人或组织。然后在我的 phone 数字控制器中,我有以下超级丑陋的东西:
if ($request->parent_type == 'organization')
{
$parent_record = Organization::find($request->parent_id);
}
elseif ($request->parent_type == 'contact')
{
$parent_record = Contact::find($request->parent_id);
}
if ($parent_record)
{
$parent_record->phone_numbers()->save($phone_number);
return redirect()->route($request->parent_type . '.show', ['id' => $request->parent_id])->with('notify', 'Phone number added!');
}
我知道必须有更好的方法来执行此操作,因为在每个创建或存储方法中我都会复制此代码。我只是不知道如何让它变得更好。
$type = ucfirst($request->parent_type);
if (in_array($type, $allowedTypes) {
$parent_record = $type::find($request->parent_id);
}
当最后一个由字符串表示时,您可以使用范围解析运算符从 class 调用静态方法。
这里有两个问题:
- 用户可以输入 class名称,您可能不想执行
find()
。也许需要一个白名单
- class 不是此命名空间的一部分 - 您需要使用完全限定的 classname
我目前在 phone 号码和联系人或组织之间存在多态关系。我正在使用 morphMap 将父关系命名空间模型的名称分别更改为联系人或组织。
目前,当我想为组织或联系人创建新的 phone 号码时,我传递了两个 URL 参数,parent_id=$record_id 和 parent_type=联系人或组织。然后在我的 phone 数字控制器中,我有以下超级丑陋的东西:
if ($request->parent_type == 'organization')
{
$parent_record = Organization::find($request->parent_id);
}
elseif ($request->parent_type == 'contact')
{
$parent_record = Contact::find($request->parent_id);
}
if ($parent_record)
{
$parent_record->phone_numbers()->save($phone_number);
return redirect()->route($request->parent_type . '.show', ['id' => $request->parent_id])->with('notify', 'Phone number added!');
}
我知道必须有更好的方法来执行此操作,因为在每个创建或存储方法中我都会复制此代码。我只是不知道如何让它变得更好。
$type = ucfirst($request->parent_type);
if (in_array($type, $allowedTypes) {
$parent_record = $type::find($request->parent_id);
}
当最后一个由字符串表示时,您可以使用范围解析运算符从 class 调用静态方法。
这里有两个问题:
- 用户可以输入 class名称,您可能不想执行
find()
。也许需要一个白名单 - class 不是此命名空间的一部分 - 您需要使用完全限定的 classname