这是一个原始SQL查询:
SELECT name, area, point(area) AS center FROM places;
我想基于此查询获得一个Eloquent模型。这是模型:
class Place extends Model
{
protected $visible = ['name', 'area'];
}
因此,如果我运行此代码,我想获取center
属性:
return response()->json( Place::all() );
缺少 center
。我不知道如何在center
对象中添加Place
属性。 我不想在我的控制器中构建原始查询,是否有任何带有mutator或类似内容的解决方案?(我唯一想要调用的是Place::all()
,我真的想在控制器中使用Eloquent Model,而不是SQL查询。
答案 0 :(得分:6)
使用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()
调用Response::json()
时,mutated属性包含在JSON /数组输出中
在代码中执行点逻辑的原因是因为使用雄辩的模型,在获取场所及其中心列表时,您会遇到N + 1查询问题,这对您的数据库来说不是一个好主意。
从数据库中获取模型的数据时,也不会使用您的查询,因为模型的默认查询是
select * from `table` where id = :id
然后在内部计算出在模型上设置数据。
答案 1 :(得分:0)
你可能想看看这个: http://laravel.com/docs/5.0/eloquent#global-scopes。它应该可以帮助您构建始终与其余数据一起居中的查询。