在 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 调用静态方法。

这里有两个问题:

  1. 用户可以输入 class名称,您可能不想执行 find()。也许需要一个白名单
  2. class 不是此命名空间的一部分 - 您需要使用完全限定的 classname