【问题标题】:Add a calculated field to Laravel model query向 Laravel 模型查询添加计算字段
【发布时间】: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 字段的控制器执行此操作。有没有办法让模型包含这样的字段?

【问题讨论】:

标签: php laravel eloquent


【解决方案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';
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 2012-08-20
    • 2016-09-26
    • 2013-07-14
    • 2013-04-22
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多