2014-08-28 15 views
13

Để nhất quán với kiểu mã hóa của tôi, tôi muốn sử dụng camelCase để truy cập các thuộc tính thay vì snake_case. Điều này có thể xảy ra trong Laravel mà không sửa đổi khung cốt lõi? Nếu vậy, làm thế nào?Tôi làm cách nào để truy cập các thuộc tính bằng cách sử dụng trường hợp lạc đà?

Ví dụ:

// Database column: first_name 

echo $user->first_name; // Default Laravel behavior 
echo $user->firstName; // Wanted behavior 

Trả lời

15

Tạo lớp BaseModel của riêng bạn và ghi đè lên các phương pháp sau đây. Đảm bảo tất cả các kiểu máy khác của bạn extendBaseModel của bạn.

class BaseModel extends Eloquent { 

    // Allow for camelCased attribute access 

    public function getAttribute($key) 
    { 
     return parent::getAttribute(snake_case($key)); 
    } 

    public function setAttribute($key, $value) 
    { 
     return parent::setAttribute(snake_case($key), $value); 
    } 

} 

Sau đó, để sử dụng:

// Database column: first_name 

echo $user->first_name; // Still works 
echo $user->firstName; // Works too! 

lừa này xoay quanh buộc chìa khóa dẫn đến trường hợp con rắn bằng cách ghi đè các phương pháp kỳ diệu được sử dụng trong Model.

+2

chắc chắn bạn đã xem http://laravelsnippets.com/ –

+4

Bạn cũng phải mở rộng các phương thức __isset() và __unset(). Các hàm isset(), empty() và unset() sẽ không hoạt động đúng với các khóa case lạc đà. Tôi đã dành nửa ngày trên con bọ này. – jaaksarv

+0

tìm kiếm điều này như cảm ơn bro! : D –

10

Vì SO không cho phép dán đoạn mã trong nhận xét, tôi đăng bài này dưới dạng câu trả lời mới.

Để đảm bảo tải mong muốn không bị hỏng, tôi phải sửa đổi câu trả lời của @ Lazlo. Khi truy cập các mối quan hệ háo hức tải bằng một khóa khác, chúng được nạp lại.

<?php 

class BaseModel extends Eloquent 
{ 

    public function getAttribute($key) 
    { 
     if (array_key_exists($key, $this->relations)) { 
      return parent::getAttribute($key); 
     } else { 
      return parent::getAttribute(snake_case($key)); 
     } 
    } 

    public function setAttribute($key, $value) 
    { 
     return parent::setAttribute(snake_case($key), $value); 
    } 
} 
+0

bạn có thể giải thích vấn đề mà bạn đã giải quyết ở đây không? Tôi không thực sự làm theo xác minh mà bạn làm trên mảng quan hệ? –

+2

giả sử bạn chạy truy vấn '' User :: with ('likedPosts') '', nó sẽ được lưu trữ như '' $ user-> attributes ['likedPosts'] ''. Tuy nhiên, khi bạn ghi đè '' getAttribute'' và thay đổi mọi thứ thành snake_case, thì nó sẽ cố gắng truy cập '' $ user-> attributes ['liked_posts'] '' khi bạn viết '' $ user-> likedPosts'', không tồn tại. Sau đó, laravel sẽ lười biếng tải mối quan hệ, mặc dù mối quan hệ đã được nạp (như là favoritesPosts). Để ngăn chặn điều này, câu lệnh '' if'' là cần thiết. –

+0

oh, tôi hiểu ngay bây giờ ... cảm ơn rất nhiều vì sự giúp đỡ của bạn! ;) –

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