Eloquent模型默认添加额外列

时间:2015-02-04 15:22:37

标签: php sql laravel eloquent

我有一个名为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 个答案:

答案 0 :(得分:7)

即使我想知道这背后的原因是什么,你可以覆盖模型中的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

答案 1 :(得分:2)

使用an accessor。这个回归'你好''对于$book->greeting,如果模型没有设置问候语:

public function getGreetingAttribute($value) {
  if(empty($value)) { return 'Hello'; } else { return $value; }
}

答案 2 :(得分:0)

我认为ORM不能很好地管理这个问题,所以如果你不能修改你的书模型但是仍然想要完成它,我建议你创建一个新版本,这样你很快就会遇到麻烦。模型指向用

构造的视图
SELECT *, 'Hello' as `greeting` FROM `books`

答案 3 :(得分:0)

您可以使用$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