向 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 模型查询添加计算字段的主要内容,如果未能解决你的问题,请参考以下文章

是否可以向 Laravel 模型添加非持久属性?

在Laravel中创建记录后发送通知

Laravel - 如何在忘记密码中添加自定义字段

Laravel 模型关系上的计算字段,如模型属性

Laravel - 向工厂创建的模型添加关系

向 Rails 模型添加额外字段以减少不必要的数据库查询