【问题标题】:how to eager load in a Many to Many relationship in laravel 5?如何在 laravel 5 中急切加载多对多关系?
【发布时间】:2016-06-06 17:00:30
【问题描述】:

我的user table 和item table 是通过多对多关系关联的,item table 在外部表中有一些数据,例如color table 我有一个将两者关联的数据透视表。 我的问题是,如果我想检索与具有颜色的用户关联的所有项目,如何通过预先加载来获取它们?

我知道$user->item 将检索该用户的所有项目。

但是,如果我想在一个查询中急切地为该用户加载具有颜色属性的所有项目,我该怎么做? 目前,我正在遍历与用户关联的项目并延迟加载我需要的每个数据,例如

foreach($user->item as $i){

      echo($i->item->color)

}

这意味着每个循环都会进行一次新的查询...

这里是模型:

用户模型:

public function item(){
        return $this->belongsToMany('App\item')->withTimestamps();
    }

商品型号:

public function user(){
        return $this->belongsToMany('App\User');
    }

这是数据透视表的架构

Schema::create('item_user', function(Blueprint $table) {

            $table->unsignedInteger('user_id')->unsigned()->index();
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');

            $table->unsignedInteger('item_id')->unsigned()->index();
            $table->foreign('item_id')
                ->references('id')
                ->on('items')
                ->onDelete('cascade');

            $table->timestamps();
        });

【问题讨论】:

  • 你可以展示或模特或你的关系

标签: laravel eloquent pivot loading eager


【解决方案1】:

您可以简单地使用Nested Eager Loading

使用 with() 完成预加载:在您的实例中,您可以使用以下内容:

public function item(){
    return $this->belongsToMany('App\item')->withTimestamps()->with('color');
}

这会急切地在“项目”上加载颜色。但是,您也可以立即加载控制器中的用户模型:

User::with('items.color')->find(1);

根据您的代码,我不确定关系/模型是这样的,但我猜您明白了。

【讨论】:

  • 谢谢,我按照您的建议修改了模型。显然现在 $user->items 将在 3 个查询中获得所有用户项目 + 颜色(?)
  • 您可以发布您的items 关系吗?我只修改了item关系,它是一个belongsToMany,你的items关系可能是hasMany?
  • 我已经在主要问题中发布了关系。你问的是这个吗?
  • 您在User 模型上调用复数items 方法,但您发布的唯一方法是单数item,它是一个belongsToMany。如果你有一个复数项方法,它可能是一个hasMany 关系..
  • 我在用户和项目之间有一个多对多的关系。代码只是一个例子。
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 2017-12-16
  • 2017-11-26
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多