[英]Add custom attribute in eloquent model
这是原始的SQL查询:
SELECT name, area, point(area) AS center FROM places;
我想基于此查询获得一个雄辩的模型。 这是模型:
class Place extends Model
{
protected $visible = ['name', 'area'];
}
因此,如果我运行以下代码,我想获取center
属性:
return response()->json( Place::all() );
center
丢失。 我不知道如何在我的Place
对象中添加center
属性。 我不想在控制器中建立原始查询,是否有使用mutator或类似方法的解决方案? (我唯一想调用的是Place::all()
,我真的很想在控制器中使用Eloquent Model,而不是SQL查询)。
结合使用Mutators和$appends
属性。 这是一个例子:
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Place extends Model {
protected $appends = ['center'];
public function getCenterAttribute()
{
return $this->point($this->getRawAttribute("area"));
}
protected function point($area)
{
// logic for SQL POINT(), etc
}
}
$appends
属性将意味着在$model->toJson()
或$model->toArray()
时,JSON / array输出中将包含mutated属性( Response::json()
$model->toJson()
)
在代码中执行点逻辑的原因是,由于雄辩的模型,在获取地点及其中心的列表时遇到了N + 1查询问题,这对您的数据库而言不是一个好主意。
从数据库中获取模型的数据时,也不会使用您的查询,因为模型的默认查询是
select * from `table` where id = :id
然后在内部找出要在模型上建立数据的位置。
您可能需要看一下: http : //laravel.com/docs/5.0/eloquent#global-scopes 。 它应该可以帮助您构建始终与其他数据并重的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.