首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >处理修订.关系列的设置属性或变异器

处理修订.关系列的设置属性或变异器
EN

Stack Overflow用户
提问于 2015-09-08 00:24:10
回答 1查看 149关注 0票数 0

伪代码--假设我有AuthorDocumentRevisionsEditor模型。

Author hasMany Document

Document hasMany Revisions

Document hasMany Editors (存储在修订表中)

但下表结构如下:

作者模型:idnameemail

文档模型:idauthor_idtitle

修订模式:iddocument_ideditor_idtextsaved_at

编者模型:idnameemail

第一个问题-存储修订历史(包括哪个编辑器在什么时候更改了文本);这是一个理想的结构吗?我想要能够做$author->documents->where('title', 'Some title')->editor->name

要从Editor中访问Document -是否值得直接在Document构造函数中设置属性:

代码语言:javascript
运行
AI代码解释
复制
public function __construct(array $attributes = [] ){
  $this->setRawAttributes(
    array_merge($this->attributes, 
      $this->revisions()->orderBy('saved_at', 'desc')->first()->attributesToArray()
    )
  );
}

或者在模型中使用变异器:

代码语言:javascript
运行
AI代码解释
复制
public function getEditorIdAttribute($value){
  return $this->revisions()->orderBy('saved_at', 'desc')->first()->editor_id;
}

还是有更好的方法来处理修订,更多的拉勒维尔/雄辩-喜欢?

EN

回答 1

Stack Overflow用户

发布于 2015-09-14 16:13:29

对于任何走上这条路的人--我无法在构造函数中设置属性并使它们在模型中可用,所以我求助于使用变异器。

为了防止每次调用mutator时都会出现一个新的查询(如果您有少量的变异器,这就加起来了)--我使用了一个简单的解决方法:

代码语言:javascript
运行
AI代码解释
复制
// Document Model
class Document extends Eloquent{
  $this->latest = ''

  // relations etc here

  public function getSomeValueAttribute{
    $this->getLatest('some_value');
  }

  public function getAnotherValueAttribute{
    $this->getLatest('another_value');
  }

  public function getLatest($attr){
    if(empty($this->latest)) $this->latest = $this->revisions->last();
    return $this->latest->getAttribute($attr);
  }

}

我确信我可以扩展getValueAttribute()变送器以保持干燥,但是上面的方法目前对我来说是有效的,并且在建立关系之前调用了变异器,所以它运行得很好。我还可以通过$document->revisions->get()看到我的所有修订,或者通过$document->text看到最新的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32452774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文