我有一个名为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
}
有什么方法可以实现这个目标吗?
非常感谢
答案 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