2014-05-03 13 views
6

Tôi có một biểu mẫu có lựa chọn thả xuống cho phép bạn chọn khóa ngoại cho một kiểu máy cụ thể. Lựa chọn hàng đầu luôn luôn là một cái gì đó giống nhưLaravel + phím ngoài có thể vô hiệu hóa

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

Vì vậy, khi tôi điền vào mô hình của tôi với dữ liệu này từ hình thức,

$booking = new Booking($data); 

Và cố gắng tiết kiệm nó,

$booking->save(); 

Nó luôn thất bại bởi vì điều đó vi phạm ràng buộc FK vì Laravel không đủ thông minh để vô hiệu hóa trường này cho tôi. Vì vậy, tôi đã đưa ra ít hack này:

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

Nhưng không có cách nào để cho Laravel biết trường nào đại diện cho FK và phải được đặt thành null nếu chúng là số nguyên> 0?

+1

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

Trả lời

14

Một giải pháp khả thi là sử dụng set mutators cho tất cả các phím nước ngoài của bạn:

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

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

trình cảm ơn rất nhiều! –

+1

Câu trả lời tuyệt vời về một cái gì đó đã đưa tôi mãi mãi để tìm ra. Một lưu ý có thể giúp: Hãy nhớ đặt tên cho trình biến đổi bằng ID - tức là nó không làm biến đổi hàm quan hệ, mà đúng hơn là trường db. Tôi đã mắc lỗi khi gọi hàm 'setVehicleAttribute' sau hàm thay vì 'setVehicleIdAttribute' cho mỗi ví dụ trên. Laravel sau đó bỏ lỡ bắt mutator. Rõ ràng trong tầm nhìn .. nhưng đã mãi mãi để tìm. – Watercayman

Các vấn đề liên quan