簡體   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