向 Laravel 模型查询添加计算字段
Posted
技术标签:
【中文标题】向 Laravel 模型查询添加计算字段【英文标题】:Add a calculated field to Laravel model query 【发布时间】:2016-11-01 23:42:38 【问题描述】:我有一个控制器,它有这样一个查询:
$post = Post::find($id);
$comments = $post->comments;
一个帖子有很多 cmets,一个评论属于一个帖子。 cmets 模型有一个 id,comment,tag 字段。
我想要做的是,对于像这样的任何查询,模型返回字段 id、comment、tag 和 tag_translated,其中后者只是使用 Lang 门面的标签的翻译。
我可以通过在控制器上使用 for 来解决这个问题,它遍历 $cmets 并添加字段,但是我必须为每个需要 tag_translared 字段的控制器执行此操作。有没有办法让模型包含这样的字段?
【问题讨论】:
***.com/questions/17232714/… 看到这个 这能回答你的问题吗? Add a custom attribute to a Laravel / Eloquent model on load? 【参考方案1】:我遇到了同样的问题,你只需要添加两件事:
第一个是 appends 字段:
protected $appends = ['field'];
第二个是“getter”:
public function getFieldAttribute()
在方法名的末尾需要加上“Attribute”后缀,就可以了。
【讨论】:
谢谢!我还了解到,如果您不添加 $appends,则仅当您在 $model->field 中特别请求时才会检索该字段。【参考方案2】:是的,有吗?只需将其添加到您的 Comment
模型中
public function getTagTranslatedAttribute()
return Lang::methodYouWish($this->tag);
然后你可以从评论实例中访问这个属性
$comment->tag_translated;
编辑
您可以修改您的toArray
方法,只需将其添加到Comment
类中
protected $appends = ['tag_translated'];
然后
$comment->toArray();
【讨论】:
谢谢!这将仅检索该属性,我希望将其附加到通过其父模型调用它时获得的结果,如 $post->cmets。然后我想检索诸如 id、comment、tag、translated_tag 之类的东西。 我想游说这是公认的答案。它更详细,更多用户。编辑后尤其如此。【参考方案3】:将此添加到您的 Comment
模型中:
protected $appends = ['tag_translated'];
public function getTagTranslatedAttribute()
return 'the translated tag';
希望这会有所帮助。
【讨论】:
以上是关于向 Laravel 模型查询添加计算字段的主要内容,如果未能解决你的问题,请参考以下文章