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