假设我得到了一个有几个关系的模型:
class Author extends Model
{
public function shortStories()
{
return $this->hasMany(ShortStory::class);
}
public function essays()
{
return $this->hasMany(Essay::class);
}
public function books()
{
return $this->hasMany(Book::class);
}
}
现在假设我还有两个模型希望通过它的关系来加载这个模型:
class Publisher extends Model
{
public function scopeWithAuthor($query)
{
$query->with('author.shortStories', 'author.essays', 'author.books');
}
}
class Reviewer extends Model
{
public function scopeWithAuthor($query)
{
$query->with('author.shortStories', 'author.essays', 'author.books');
}
}
问题 - 如果作者的关系发生变化,我现在需要在多个位置反映这一点。
我的问题 - 如何以干式风格实现这一目标?
我知道我可以在Author类中添加一个受保护的$with
但是它总是加载关系,而不仅仅是在需要时。
考虑到这一点,我提出的一个解决方案是扩展Author
模型,如下所示:
class AuthorWithRelations extends Author
{
protected $with = ['shortStories', 'essays', 'books'];
}
这允许我像这样重构其他模型的范围:
class Publisher extends Model
{
public function scopeWithAuthor($query)
{
$query->with('authorWithRelations');
}
}
class Reviewer extends Model
{
public function scopeWithAuthor($query)
{
$query->with('authorWithRelations');
}
}
这很好用,但我真的想知道Laravel是否提供更好/内置的方法吗?