Laravel DRY嵌套渴望加载

时间:2016-09-30 09:39:02

标签: php laravel eloquent

假设我得到了一个有几个关系的模型:

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是否提供更好/内置的方法吗?

0 个答案:

没有答案