Обновите Laravel Eloquent ORM с помощью массива

Я пытаюсь понять, как обновить и модальный Eloquent ORM из массива. Вместо того, чтобы идти поле за полем. Это то, что у меня есть до сих пор.

public static function updatePatient($id){
    $patient_payload = Input::all();  // eg. array('patient_first_name'=>'Test', 'patient_last_name'=>'TEST')
    $patient_to_update = Patient::find($id);

    /*
    |--------------------------------------------------------------------------
    | Validate the request
    |--------------------------------------------------------------------------
    */
    if(!$patient_to_update)
        return Response::json(array('error'=>'No patient found for id given'), 400);

    /*
    |--------------------------------------------------------------------------
    | Update the patient entry.
    |--------------------------------------------------------------------------
    */


    $patient_to_update->update($patient_payload);
    $patient_to_update->save();

    return Response::json(array('success'=>'Patient was updated'));
}

Это выдает ошибку модели laravel, просто говоря: «patient_first_name» и да, «терпеливое_первое_имя» — это столбец в базе данных. В качестве обходного пути я только что делал это, и это работает.

public static function updatePatient($id){
    $patient_payload = Input::all();
    $patient_to_update = Patient::find($id);

    /*
    |--------------------------------------------------------------------------
    | Validate the request
    |--------------------------------------------------------------------------
    */
    if(!$patient_to_update)
        return Response::json(array('error'=>'No patient found for id given'), 400);

    /*
    |--------------------------------------------------------------------------
    | Update the patient entry. 
    |--------------------------------------------------------------------------
    */


    DB::table('patients')
        ->where('id',$id)
        ->update($patient_payload);

    //update laravel timestamps
    $patient_to_update->touch();        
    return Response::json(array('success'=>'Patient was updated'));
}

person krosullivan    schedule 06.12.2013    source источник
comment
Можете ли вы опубликовать точную ошибку, которую вы получаете?   -  person Manuel Pedrera    schedule 07.12.2013


Ответы (1)


Поскольку то, что вы пытаетесь сделать, это массовое назначение, я предлагаю проверить, определили ли вы свойство $fillable в своей модели Patient:

class Patient extends Eloquent {

    protected $fillable = array('patient_payload');

}

В качестве меры безопасности Eloquent не позволит вам изменять какие-либо атрибуты модели с помощью массового назначения, если вы не укажете $fillable (белый список разрешенных атрибутов) или $guarded (черный список запрещенных атрибутов).


Дальнейшее чтение:

person Manuel Pedrera    schedule 06.12.2013
comment
Это здорово, это работает. Я внес поля в белый список с помощью $guarded. Здорово, что laravel по умолчанию защищает от массового присваивания. - person krosullivan; 07.12.2013