与模型属性的 where 条件的雄辩关系

Posted

技术标签:

【中文标题】与模型属性的 where 条件的雄辩关系【英文标题】:Eloquent relation with where condition on model attribute 【发布时间】:2015-02-07 11:41:38 【问题描述】:

我有两个模型 StudentStudentRevisionStudent 模型有 hasManyStudentRevision 模型的关系。我在Student 中将hasMany 关系定义为

public function revisions()

    return $this->hasMany(
        'StudentRevision',
        'sid'
    );

我在 students 表(学生模型)中有一个字段,它引用 student_revisions 表中学生的当前版本。

表结构是这样的。

学生 sid srid name ....

student_revisions srid sid 批处理 ....

现在我想定义 hasOneStudentRevision 模型的关系,该模型引用 current revisionStudent 链接。目前我已将此关系定义为:

public function current()

    return $this->hasOne(
        'StudentRevision',
        'sid'
    )
    ->where('srid', $this->srid);

但这种关系的问题在于,$this->srid 在查询构建过程中不可用,只有在实际模型可用后才能存在。

请帮助解决这个问题。

【问题讨论】:

为什么->where('srid', $this->srid) 在里面?我从未见过有人试图定义这样的关系。 你到底想达到什么目的?我敢打赌,反向引用这些表会使事情变得过于复杂,而且它可以做得更容易,所以只需描述你需要什么。 我有一个主表 students 和辅助表 student_revisions 存储学生的多个修订。当前的学生版本通过student 表中的srid 字段链接到学生。 Current 关系/范围返回student 表中srid 列中引用的学生的修订版。现在我想从student 表中加载记录,其中current 关系/范围的student_revisions 表中的特定列与某些内容匹配。希望我很清楚。 我认为这不是一个好主意。是什么让revision 成为当前的,为什么不为此使用修订表?无论如何,对于这个设置,你需要Student belongsTo RevisionRevision hasOne Student (current),所以要获取你需要whereHas 的用户。回答我的问题,如果您需要进一步的帮助,请告诉我。 【参考方案1】:

我认为您不能将其定义为关系。但是你可以这样做:

public function current()
    return $this->revisions()->where('srid', $this->srid)->get();

这样您就可以通过$student->current() 访问它。你甚至可以更进一步,让relationship 更像:

public function current()
    return $this->revisions()->where('srid', $this->srid);


public function getCurrent()
    return $this->current()->get();


protected $appends = array('current');

这里我们为我们的属性定义了一个访问器。 Laravel Docs(向下滚动到底部)

然后我们可以这样使用它:

$student->current; // retrieves the model
$student->current(); // retrieves an instance of the query builder

【讨论】:

感谢您的意见。这是绝对正确的,你提到的方式。事实上,这工作得很好,直到我进入一个场景,我必须根据student_revision 表中的列过滤我的查询。就像现在我必须加载 section 中的 current 关系等于某事的记录。我可以在查询构建时为revisionswhereHas 的关系做到这一点,但是current 范围/关系呢?

以上是关于与模型属性的 where 条件的雄辩关系的主要内容,如果未能解决你的问题,请参考以下文章

雄辩地查询与嵌套 WHERE 的关系

雄辩的 ORM 和 EAV

如何在 Laravel 雄辩关系中添加多个条件

一个查询中的雄辩模型关系

如何使用父枢轴值作为条件获得雄辩的关系

Laravel - 雄辩的自我关系