代码之家  ›  专栏  ›  技术社区  ›  Thomas Clayson

Elquent模型默认添加额外列

  •  4
  • Thomas Clayson  · 技术社区  · 9 年前

    我有一个叫 Book 我想在默认SQL中添加一个额外的列。

    目前,默认sql如下所示:

    SELECT * FROM `books`
    

    但我希望默认SQL如下所示:

    SELECT *, "Hello" as `greeting` FROM `books`
    

    以便我可以执行以下操作:

    // in a controller function...
    $book = Book::find(1);
    echo $book->greeting; // Hello
    
    $books = Book::all();
    foreach($books as $book){
        echo $book->greeting; // Hello
    }
    

    我有没有办法做到这一点?

    非常感谢

    4 回复  |  直到 9 年前
        1
  •  8
  •   lukasgeiter    9 年前

    尽管我想知道这背后的原因是什么,但你可以忽略 newQuery 在您的模型中

    public function newQuery(){
        $query = parent::newQuery();
        return $query->selectRaw('*, "Hello" AS greeting');
    }
    

    另一种方法是使用 scope :

    public function scopeWithGreeting($query){
        return $query->selectRaw('*, "Hello" AS greeting');
    }
    

    用法:

    $book = Book::withGreeting()->find(1);
    

    如果您真的每次都想要范围,可以使用 global scope 所以你不必打电话 withGreeting 总是

        2
  •  2
  •   ceejayoz    9 年前

    使用 an accessor 。此命令返回“Hello” $book->greeting 如果模型没有问候语集:

    public function getGreetingAttribute($value) {
      if(empty($value)) { return 'Hello'; } else { return $value; }
    }
    
        3
  •  0
  •   DiegoCoderPlus    9 年前

    我认为ORM将不能很好地管理这一点,所以你迟早会遇到麻烦,如果你不能修改你的书本模型,但仍然能够完成这一点的话,我建议你创建一个新的模型,指向一个用

    SELECT *, 'Hello' as `greeting` FROM `books`
    
        4
  •  0
  •   ARIF MAHMUD RANA    7 年前

    您可以使用 $appends 以下是示例

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Book extends Model
    {
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name',
        ];
    
        /**
         * The accessors to append to the model's array form.
         *
         * @var array
         */
        protected $appends = ['greeting'];
    
        public function getGreetingAttribute()
        {
            return 'Hello';
        }
    }
    

    您不需要为此编写任何SQL查看更多信息 https://github.com/laravel/framework/blob/5.5/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php#L59-L64