Laravel RESTFul API将字段映射到模型

时间:2014-08-19 15:14:42

标签: php laravel

我们正在使用Laravel 4构建RESTful API。在使用优秀的Laracasts系列进行一些初步培训之后,我们给出的一个提示是使用对象变换器将我们的db结构转换为更易读的响应字段..所以对于例子' user_qual'可能会成为用户资格'等等。这意味着对基础结构的更改不会影响API定义。

但是,我们现在发现用户希望使用相同的命名约定发送POST请求,因此他们会在名为' user_qualification'我们现在需要将其映射到底层数据库表,但这个步骤似乎并未涵盖在laracasts中。我们现在正在做的事情如下所示(对于PUT)并且它有效,但是有更好的方法吗?在我们使用变换器之前,很容易将input :: all()映射到模型对象并进行更新,所以我认为必须有一个更简单的方法!感谢任何提示!

$this->staff = Staff::find($id);
    if (!$this->staff) return $this->respondNotFound('Staff not found', 100);

//map inbound to model
    $newStaffData = array();
    if (Input::has('name')) $newStaffData = array_add($newStaffData, 'name', Input::get('name'));
    if (Input::has('mobile')) $newStaffData = array_add($newStaffData, 'mobile_num', Input::get('mobile'));
    if (Input::has('email')) $newStaffData = array_add($newStaffData, 'email_address', Input::get('email'));
    if (Input::has('employee_id')) $newStaffData = array_add($newStaffData, 'employee_num', Input::get('employee_id'));
    if (Input::has('staff_id')) $newStaffData = array_add($newStaffData, 'unique_id', Input::get('staff_id'));
    if (Input::has('home_number')) $newStaffData = array_add($newStaffData, 'alternate_contact_num', Input::get('home_number'));
    if (Input::has('address_line_1')) $newStaffData = array_add($newStaffData, 'address_line_1', Input::get('address_line_1'));
    if (Input::has('address_line_2')) $newStaffData = array_add($newStaffData, 'address_line_2', Input::get('address_line_2'));
    if (Input::has('address_line_3')) $newStaffData = array_add($newStaffData, 'address_line_3', Input::get('address_line_3'));
    if (Input::has('address_line_4')) $newStaffData = array_add($newStaffData, 'address_line_4', Input::get('address_line_4'));
    if (Input::has('post_code')) $newStaffData = array_add($newStaffData, 'postcode', Input::get('post_code'));
    if (Input::has('country')) $newStaffData = array_add($newStaffData, 'country_id', Input::get('country'));

    $this->staff->fill($newStaffData);

    if (!$this->staff->isValid('update')) {
        return $this->respondCantProcess('Validation Failed - ' . $this->staff->errors, 100);
    }

1 个答案:

答案 0 :(得分:2)

Fractal可能对您有用。

有一种更简单的方法,但Laravel没有提供。只需编写更好的PHP将大大减少您需要编写的内容。例如:

$newStaffData = array(
    'name' => Input::get('name', $this->staff->name),
    'mobile_num' => Input::get('mobile', $this->staff->mobile_num),
    'email_address' => Input::get('email', $this->staff->email_address),
    // ... and so on
);

$this->staff->fill($newStaffData);

if (!$this->staff->isValid('update')) {
    return $this->respondCantProcess('Validation Failed - ' . $this->staff->errors, 100);
}

如果你经常进行这种类型的编码,我会创建一个简化过程的函数。例如,您可以执行以下操作:

function array_trans(array $lookup, $data)
{
    $translated = array();

    foreach($lookup as $from => $to)
    {
        if (array_key_exists($from, $data))
        {
            $translated[$to] = $data[$from];
        }
    }

    return $translated;
}

使用示例:

$lookup = array(
    'name' => 'name',
    'mobile' => 'mobile_num',
    'email' => 'email_address',
);

$newStaffData = array_trans($lookup, Input::get());