2013-07-09 7 views
19

tôi nhận được một mô hình gọi là Run, trong đó có phương pháp này:Bỏ qua mô hình accessor

public function getNameAttribute($name){ 
    if($name == 'Eendaags') 
     return $this->race_edition->race->name; 

    return $this->race_edition->race->name.' '.$name; 
} 

tôi cần thiết lập này cho quản trị laravel, vì rất nhiều lần chạy sẽ có cùng tên và sự khác biệt duy nhất là tên chủng tộc. Nhưng ở 1 vị trí trên trang web, tôi chỉ cần lấy tên mà không bị đột biến. Đây có phải là tài sản không?

+0

Bạn có thể chuyển sang sử dụng chức năng 'getNameRaceAttribute', chỉ được quản trị viên sử dụng và đặt quản trị viên sử dụng trường' -> name_race', sau đó -> tên sẽ như thường lệ. Không có chức năng "Nhận thuộc tính thô" trong tài hùng biện. mã có liên quan: https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L1839 –

+0

Đã thử điều này nhưng nó sẽ mang lại các vấn đề khác với nó. Tôi đoán tôi cần phải hack nó trong quản trị viên. – LHolleman

Trả lời

63

đây là cách đúng

// that skips mutators 
$model->getOriginal('name'); 

https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_getOriginal

Edit:cẩn thận!

Khi Maksym Cierzniak giải thích trong các ý kiến, getOriginal() không chỉ bỏ qua trình tắt, nó cũng trả về giá trị "ban đầu" của trường tại thời điểm đối tượng được đọc từ cơ sở dữ liệu. Vì vậy, nếu bạn đã sửa đổi thuộc tính của mô hình, điều này sẽ không trả lại giá trị đã sửa đổi của bạn, nó sẽ vẫn trả lại giá trị ban đầu. Cách ổn định hơn và đáng tin cậy để có được giá trị un-biến đổi từ bên trong lớp mô hình là để lấy nó ra khỏi attributes bất động sản như thế này:

$this->attributes['name'] 

Nhưng lưu ý rằng attributes là một tài sản được bảo vệ, vì vậy bạn có thể' t làm điều đó từ bên ngoài lớp mô hình. Trong trường hợp đó, bạn có thể sử dụng

$model->getAttributes()['name']` 

hoặc kỹ thuật của Maksym từ nhận xét bên dưới.

+1

Tuyệt vời !! Đây chính xác là những gì tôi cần, cảm ơn rất nhiều. Muốn điều này là bên trong tài liệu. –

+6

@SteveBauman Một vấn đề bạn có thể gặp phải là '' getOriginal() '' trả về giá trị ban đầu được trả về từ cơ sở dữ liệu. Vì vậy, nếu bạn có '' name = something'' và bạn sẽ thay đổi nó và gọi '' getOriginal ('name') '' bạn sẽ vẫn nhận được giá trị '' something''. Vì vậy, bạn có thể lấy giá trị tốt hơn như '' $ name = array_get ($ model-> getAttributes(), 'name'); '' Bằng cách này bạn sẽ chắc chắn rằng bạn có giá trị mới. –

+0

Thông tin tốt. Điều này phải được đánh dấu là câu trả lời được chấp nhận. –

0

Tôi đã gặp sự cố với trình truy cập Eloquent và ràng buộc mô hình biểu mẫu - bằng cách định dạng số nguyên với money_format, giá trị không còn được tải vào trường nhập số biểu mẫu.

Cách giải quyết Tôi đang sử dụng là tạo ra một accessor với một cái tên khác:

public function getRevenueDollarsAttribute($value) 
{ 
    return money_format('$%i', $this->revenue); 
} 

này cung cấp cho tôi với một accessor mà không ảnh hưởng mô hình hình thức ràng buộc.