雄辩地渴望通过查询加载多个深度

时间:2018-11-03 05:30:23

标签: laravel eloquent inner-join eager-loading multi-level

因此,这适用于对如何通过雄辩的方式快速加载多个深度模型感到好奇的人。我为此苦苦挣扎了几天,找不到任何能确切显示我正在尝试做的资源。

我正在尝试做的事情: 我正在一个项目中,就字段类型而言,我对表格布局没有太多控制权。我必须非常谨慎地设计它们的结构,因为它正在集成到现有项目中。作为此集成的一部分,我必须处理过多的标准化。我遇到的问题是有一堆规范化的表,它们在不同的方向上具有许多关系。

坚韧不拔:

模型-客户,投资,文件及更多

问题是我想急于用“带有文档的投资”加载“客户”模型。我只需要使用当前所选投资的投资以及该投资的所有文档来加载当前客户的客户模型。

模型:

//Clients Model
class Client extends Authenticatable
{
    public function investments()
    {
        // A client can have many investments
        return $this->belongsToMany('App\Models\Investment\Investment');
    }

    public function investmentDocuments()
    {
        // A Client can have many Investment Documents
        return $this->belongsToMany('App\Models\Investment\Investmentdocument');
    }
}

// Investments Model
class Investment extends Model
{
    public function clients()
    {
        // An Investment can belong to many Clients
        return $this->belongsToMany('App\Models\Client');
    }

    public function documents()
    {
        // An Investment can have many Investment Documents
        return $this->hasMany('App\Models\Investment\Investmentdocument');
    }
}

// Documents Model
class Investmentdocument extends Model
{
    public function client()
    {
        // An Investment Document can belong to more than one Client
        return $this->belongsToMany('App\Models\Client');
    }

    public function investment()
    {
        // An Investment Document belongs to one Investment
        return $this->belongsTo('App\Models\Investment\Investment');
    }
}

渴望的负荷:

$client = Client::where('id',\Auth::user()->id)->with([
   'investments' => function ($q) use($request) {
      $q->find($request->investmentid);
   },'investments.documents'])->first();

使用这种方法,我能够在Clients-> Investments-> Documents上获得不错的回报,因此我可以干净地创建新文件,这些文件将自动属于属于Clients的投资。这可能不是最好的方法,但是它有效并且渴望加载,这正是我真正想要实现的目标。该站点将获得大量流量,我无法保留多次拨打电话的资源。

如果任何人都有另一种方法来完成此任务,而又无需重组表或模型(太多),请随时发表评论。我愿意提出建议。我只是想分享一下,以防别人尝试做与我相同的事情。

0 个答案:

没有答案