在Laravel中保存多态关系

时间:2016-03-17 00:08:54

标签: php laravel laravel-5 polymorphism polymorphic-associations

我目前在电话号码和联系人或组织之间存在多态关系。我使用morphMap将父关系命名空间模型的名称分别更改为联系人或组织。

目前,当我想为组织或联系人创建新的电话号码时,我传递了两个URL参数:parent_id = $ record_id和parent_type = contact或organization。然后在我的电话号码控制器中,我有以下超级丑陋:

    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!');
    }

我知道必须有更好的方法来执行此操作,因为在每个创建或存储方法上我都会复制此代码。我只是不知道如何做得更好。

1 个答案:

答案 0 :(得分:1)

$type = ucfirst($request->parent_type);
if (in_array($type, $allowedTypes) {
    $parent_record = $type::find($request->parent_id);
}

当最后一个用字符串表示时,您可以使用范围解析运算符从类中调用静态方法。

这里有两个:

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