【问题标题】:Saving Polymorphic Relations in Laravel在 Laravel 中保存多态关系
【发布时间】:2016-03-17 00:08:53
【问题描述】:

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

目前,当我想为组织或联系人创建新电话号码时,我会传递两个 URL 参数,parent_id=$record_id 和 parent_type=contact or 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!');
    }

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

【问题讨论】:

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


    【解决方案1】:
    $type = ucfirst($request->parent_type);
    if (in_array($type, $allowedTypes) {
        $parent_record = $type::find($request->parent_id);
    }
    

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

    这里有两个问题:

    1. 用户可以输入一个类名,你可能不想执行find()。也许需要一个白名单
    2. 该类不属于此命名空间 - 您需要使用全限定类名

    【讨论】:

    • 我最终使用这个例子在构造函数中创建了一个允许模型的数组,然后是一个检查数组并确认它是允许的函数。将此标记为正确答案,因为它帮助我到达了我想去的地方。谢谢!
    猜你喜欢
    • 2015-02-15
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2015-03-05
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多