Laravel 5.2 $ compilabili

Diciamo che il mio model ha la seguente struttura di DB:

name:string last_name:string 

E desidero aggiornare il model, con questo arrays $request->input() dato:

 name => 'Quinn', last_name => 'Daley', middle_name => 'Phill' 

Avrei ricevuto un messaggio di errore, perché avrebbe tentato di aggiornare il field middle_name , che non esiste nel DB.

Quindi ecco la mia domanda: come posso renderlo così solo i campi esistenti vengono aggiornati? Senza utilizzare la properties; protected $fillable .

Modifica: la ragione per cui non voglio usare $ fillable è che non voglio elencare tutti i campi esistenti dal database. Cosa succede se ho un model grande con 50 campi al suo interno? Non c'è la possibilità di accettare solo i parametri che esistono nel model DB da $request->input() ?

AGGIORNARE

C'è una soluzione più pulita usando $model->getAttributes() :

 $user->update($request->only(arrays_keys($user->getAttributes())) 

Questa soluzione è anche migliore se si utilizza una $connection diversa per il model, che era il mio caso.

Invece di utilizzare input() o all() , è ansible utilizzare i methods only() o except() sulla richiesta per limitare i campi. Per esempio:

 $user = User::find(1); $user->update($request->only(['name', 'last_name'])); // or $user->update($request->except(['middle_name'])); 

modificare

Se si desidera get i nomi delle colonne della tabella, è ansible farlo utilizzando Schema::getColumnListing($tableName); . Quindi, in questo caso, il tuo codice sarà simile a qualcosa:

 $user = User::find(1); $user->update($request->only(Schema::getColumnListing($user->getTable()))); 

sarà richiesto $ fillable protetto, se si utilizza la function di creazione o aggiornamento. tuttavia, penso che lo risolvi in ​​questo modo senza utilizzare la properties; protetta $ fillable.

 $yourmodel = YourModel::find($id); $yourmodel->name = $request->input("name"); $yourmodel->last_name = $request->input("last_name"); $yourmodel->save(); 

È ansible utilizzare arrays compilabili in questo modo:

 // in your model /** * Get only available fields * * @param arrays $input * @return arrays */ public function filterFields(arrays $input) { $fields = $this->fillable; return arrays_filter($input, function ($v, $k) use ($fields) { return in_arrays($k, $fields); }, ARRAY_FILTER_USE_BOTH); } 

E filtra i dati da $request->input() ; Inoltre puoi fare il middleware per questo scopo.