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