Eloquent 模型默认添加额外的列

Eloquent model add extra column by default

我有一个名为 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
}

有什么办法可以实现吗?

非常感谢

虽然我想知道这背后的原因是什么,但您可以在模型中覆盖 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

我认为 ORM 不能很好地管理,所以你迟早会遇到麻烦,如果你不能修改你的书籍模型但仍然想完成它,我建议你创建指向使用

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

使用an accessor。这个 returns 'Hello' 用于 $book->greeting 如果模型没有问候集:

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

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