Php Laravel干嵌套加载

Php Laravel干嵌套加载,php,laravel,eloquent,Php,Laravel,Eloquent,假设我得到了一个有几个关系的模型: 类作者扩展模型 { 公共功能短篇小说() { 返回$this->hasMany(ShortStory::class); } 公共职能论文() { 返回$this->hasMany(文章::类); } 公共职能书() { 返回$this->hasMany(Book::class); } } 现在假设我还有两个模型想要加载这个模型及其关系: 类发布器扩展了模型 { 公共函数scopeWithAuthor($query) { $query->with('autho

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

类作者扩展模型
{
公共功能短篇小说()
{
返回$this->hasMany(ShortStory::class);
}
公共职能论文()
{
返回$this->hasMany(文章::类);
}
公共职能书()
{
返回$this->hasMany(Book::class);
}
}
现在假设我还有两个模型想要加载这个模型及其关系:

类发布器扩展了模型 { 公共函数scopeWithAuthor($query) { $query->with('author.shortStories'、'author.散文'、'author.books'); } } 类审阅者扩展模型 { 公共函数scopeWithAuthor($query) { $query->with('author.shortStories'、'author.散文'、'author.books'); } } 问题-如果作者关系发生变化,我现在需要在多个位置反映这一点

我的问题-我如何在干燥的风格中实现这一点

我知道我可以将受保护的
$with
添加到Author类中,但它总是会加载关系,而不仅仅是在需要时

考虑到这一点,我提出的一个解决方案是扩展
Author
模型,如下所示:

类AuthorWithRelations扩展了Author
{
受保护的$with=[“短篇小说”、“散文”、“书籍”];
}
这样我就可以重构其他模型的作用域,如下所示:

类发布器扩展了模型 { 公共函数scopeWithAuthor($query) { $query->with('authorWithRelations'); } } 类审阅者扩展模型 { 公共函数scopeWithAuthor($query) { $query->with('authorWithRelations'); } }
这已经足够好了,但我真的想知道Laravel是否提供了一种更好的/内置的方法?

也许您可以提取一个只有
scopeWithAuthor
方法的抽象类。无论你决定如何实现这一点——当你调用你的作者模型时,你最终将决定你想要的是有关系的作者还是没有关系的作者。您可以调用另一个类(如果更改了模型的结构,则需要重构),也可以使用laravel native with方法。如果您的模型发生更改,则会发生重构。我同意DRY原则,但这可能是过早的过度优化,因为您给出的示例是“如果btw图书和作者的关系发生变化怎么办?”。。。自从古腾堡以来,它一直没有改变。这只是一个例子,我的实际关系与书籍无关,这只是为了简化和演示手头的问题,但感谢你对这个罐头和钢铁人的想法-我得到的印象是,没有内置的拉维尔解决方案,这很公平:-)也许您可以提取一个只具有
scopeWithAuthor
方法的抽象类。无论你决定如何实现这一点——当你调用你的作者模型时,你最终将决定你想要的是有关系的作者还是没有关系的作者。您可以调用另一个类(如果更改了模型的结构,则需要重构),也可以使用laravel native with方法。如果您的模型发生更改,则会发生重构。我同意DRY原则,但这可能是过早的过度优化,因为您给出的示例是“如果btw图书和作者的关系发生变化怎么办?”。。。这只是一个例子,我的实际关系与书籍无关,这只是为了简化和证明手头的问题,但感谢你对这个罐头和钢铁人的想法-我得到的印象是,没有内置的拉威尔解决方案,这很公平:-)