2014-05-03 21 views
6

Ho un modulo con una selezione a discesa che consente di scegliere una chiave esterna per un modello particolare. La prima opzione è sempre qualcosa di simileLaravel + chiavi esterne nullable

<option value="">please select</option> 

Così, quando mi riempio il mio modello con questi dati dalla forma,

$booking = new Booking($data); 

E cercare di salvarlo,

$booking->save(); 

Non riesce sempre perché questo viola il vincolo FK perché Laravel non è abbastanza intelligente da annullare questo campo per me. Così sono arrivato fino a questo piccolo hack:

public function save() { 
    if(!$this->vehicle_id) $this->vehicle_id = null; 
    if(!$this->driver_id) $this->driver_id = null; 
    parent::save(); 
} 

Ma non c'è alcun modo per dire che laravel campi rappresentano FKS e devono essere impostati su null se un intero> 0?

+1

http://stackoverflow.com/questions/17452923/empty-string-instead-of-null-values-eloquent –

risposta

14

Una possibile soluzione è quella di utilizzare set mutators per tutte le chiavi esterne:

public function setVehicleIdAttribute($value) { 
    $this->attributes['vehicle_id'] = $value ?: null; 
} 

public function setDriverIdAttribute($value) { 
    $this->attributes['driver_id'] = $value ?: null; 
} 
+0

Opere grazie mille! –

+1

Ottima risposta a qualcosa che mi ha portato per sempre a capire. Una nota che può essere d'aiuto: ricordati di nominare il mutatore con l'ID, cioè non sta mutando la funzione di relazione, ma piuttosto il campo di DB. Stavo facendo l'errore di chiamare la funzione 'setVehicleAttribute' dopo la funzione invece di 'setVehicleIdAttribute' come nell'esempio sopra. Laravel poi ha mancato di prendere il mutatore. Ovvio col senno di poi .. ma ha impiegato un'eternità per trovare. – Watercayman