在eloquent模型中添加自定义属性

时间:2015-07-06 08:48:46

标签: php postgresql laravel eloquent laravel-5

这是一个原始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查询。

2 个答案:

答案 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。它应该可以帮助您构建始终与其余数据一起居中的查询。