2014-10-30 3 views
0

В Laravel 4 у меня есть модель, связывающая таблицу базы данных. Назовем это Model.Laravel 4 Present Model

Скажите, что эта модель имеет столбец базы данных, называемый Property A и Property B.

Когда я делаю получить запрос вызова к моей модели, т.е. Model::all() или Model::find($id), я не хочу возвращаться Property A или Property B, но какой-то функции из двух, которая появляется на переднем конце, как своего рода только для чтения, то есть Property C.

Нужно ли использовать библиотеку ведущего здесь, или есть способ переопределить функции модели в Laravel 4?

Ключ для меня здесь является то, что свойство проявляется, когда я звоню Model::all()

EDIT:

В моем понимании это должно вернуть атрибут с именем foo постоянно со значением "foo":

Модель

class DiscountLink extends Eloquent { 
    protected $table = 'discountLinks'; 
    protected $hidden = array('tag'); 
    protected $fillable = array('name', 'currency', 'language', 'price', 'instalments', 'expires', 'active', 'foo'); 

    public function getFooAttribute() 
    { 
     return "foo"; 
    } 
} 

Контроллер

class DiscountLinkController extends \BaseController { 
    public function index() 
    { 
     return DiscountLink::all(); 
    } 
} 

ответ

1

Используйте accessor в вашем Model. Объединяем А и В, например:

public function getPropertyCAttribute() 
{ 
    return $this->attributes['property_a'] . ' ' . $this->attributes['property_b']; 
} 

И тогда вы можете получить доступ к Model::find($id)->propertyC.

Если вы хотите, чтобы атрибут автоматически включаются в результаты массива вашей модели (например, если вы отправляете результаты Model::all() или Model::get() как JSON, например), добавить $appends заявление в верхней части модели:

protected $appends = array('PropertyC'); 

Если функция является то, что может быть сделано в базе данных (например, конкатенация, сумма и т.д.), можно также добавить команду DB::raw к вашему запросу, например:

Model::select(*, DB::raw('CONCAT(PropertyA, " ", PropertyA) AS PropertyC'))->... 
+0

Должно ли 'propertyC' появляться, когда я называю' Model :: all() '? – iamyojimbo

+0

Да, когда вы просматриваете результаты для доступа к отдельным строкам. Поэтому, если вы вызвали '$ model = Model :: all()', тогда у вас есть доступ к 'propertyC' внутри' foreach ($ model ad $ m) {var_dump ($ m-> propertyC)}; '. Кроме того, убедитесь, что значение в атрибутах '$ this-> ['']' является фактическим именем поля в вашей базе данных; он чувствителен к регистру, поэтому, если ваш столбец называется 'property_a', то accessor должен ссылаться на' $ this-> attributes ['property_a']; ' – damiani

+0

Скажите, что у меня есть эта функция:' public function getFooAttribute() { return "goooglelelgoo"; } 'Тогда должно ли я всегда иметь свойство Foo, возвращаемое? – iamyojimbo