繁体   English   中英

在雄辩的模型中添加自定义属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM