在Laravel中正确使用访问器

Kel*_*nan 4 accessor laravel eloquent

我是Laravel的新手,正在构建一个简单的CRUD应用程序,以了解有关该框架的更多信息.我很好奇正确使用访问器.

我认为访问器非常适合格式化模型的属性以便在视图中显示,就像Angular中的过滤器一样.目前我有一些访问器设置为在视图中将char(1)字段转换为完整值,例如"c"为现金或"f"为融资.这是访问者的预期(或可接受的)使用吗?如果是这样,有什么方法可以阻止访问者格式化绑定到表单的属性,例如,在编辑路径中.

例如,我将数据库中的货币金额存储为十进制,但使用字符($ 150,00)对其进行格式化以在show route中显示.如何在填充编辑表单时阻止访问者更改值?(验证将失败,因为输入仅限于数值).

http://laravel.com/docs/4.2/eloquent#accessors-and-mutators

http://laravel.com/docs/4.2/html#form-model-binding

Mar*_*łek 12

一切都取决于您的需求.关键是您不需要为实际的列/属性创建访问器.例如,让我们在DB中确定您有价格区域.

使用以下代码:

$model = Model::find(1);
echo $model->price;
Run Code Online (Sandbox Code Playgroud)

您可以显示行价仅显示数据库中的数据.

但您也可以为现有属性创建访问者:

public function getCurPriceAttribute($value)
{
     return '$ '.($this->price * 1.08); // for example adding VAT tax + displaying currency
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

$model = Model::find(1);
echo $model->price;
echo $model->cur_price;
Run Code Online (Sandbox Code Playgroud)

现在,如果您想将数据放入表单中,您将使用$model->price以允许用户在没有货币的情况下更改数据,而在其他您希望使用货币显示产品价值的地方$model->cur_price

  • @damiani - 实际上你可以做`$ model-> getOriginal('price')`强制Eloquent在任何格式化之前返回原始值.不需要另外的功能. (7认同)
  • 请注意,您也可以执行反向...如果您希望`price`**通常*返回格式为`$ 150,00`,但需要几个地方的无格式版本,您可以设置类似`public function getPriceRawAttribute($ value){return($ this-> price); 为你的表单调用`$ model-> price_raw`. (4认同)
  • 那么,如果在Model类上有一个方法,例如`$ model-> currentPrice`,这有什么不同?这样做会带来什么好处? (4认同)