How can I access attributes using camel case?

后端 未结 3 1789
面向向阳花
面向向阳花 2020-12-14 02:01

To be consistent over my coding style, I\'d like to use camelCase to access attributes instead of snake_case. Is this possible in Laravel without m

相关标签:
3条回答
  • 2020-12-14 02:37

    Just thought I'd post this in case it helps anyone else. Though the entry by Bouke is great it does not address lazy-loaded relations that use a camel-case name. When this occurs we simply need to check for the method name in addition to the other checks. The following is what I did:

    class BaseModel extends Eloquent
    {
    
        public function getAttribute($key)
        {
    
            if (array_key_exists($key, $this->relations)
              || method_exists($this, $key)
            )
            {
                return parent::getAttribute($key);
            }
            else
            {
                return parent::getAttribute(snake_case($key));
            }
        }
    
        public function setAttribute($key, $value)
        {
            return parent::setAttribute(snake_case($key), $value);
        }
    }
    
    0 讨论(0)
  • 2020-12-14 02:45

    Create your own BaseModel class and override the following methods. Make sure all your other models extend your BaseModel.

    namespace App;
    
    use Illuminate\Foundation\Auth\User;
    use Illuminate\Support\Str;
    
    class BaseUser extends User
    {
        public function getAttribute($key) {
            if (array_key_exists($key, $this->relations)) {
                return parent::getAttribute($key);
            } else {
                return parent::getAttribute(Str::snake($key));
            }
        }
    
        public function setAttribute($key, $value) {
            return parent::setAttribute(Str::snake($key), $value);
        }
    }
    

    Then for usage:

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

    This trick revolves around forcing the key to snake case by overriding the magic method used in Model.

    0 讨论(0)
  • 2020-12-14 02:47

    Since SO doesn't allow pasting code snippets in comments, I'm posting this as a new answer.

    To make sure that eager loading does not break, I had to modify @Lazlo's answer. When accessing eagerly loaded relations by a different key, they are reloaded.

    <?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 讨论(0)
提交回复
热议问题