【问题标题】:Querying 'across' pivot table查询“跨”数据透视表
【发布时间】:2015-03-31 03:46:05
【问题描述】:

我有两个模型,啤酒和发行版,它们具有多对多的关系。枢轴模型hasMany 桶,其中包含一些与啤酒相关的信息,例如价格和状态。当我建立我的啤酒索引时,我需要啤酒型号、经销商型号和小桶型号的所有信息。我想弄清楚的是如何以有效的方式查询所有信息。这是我当前的查询:

小桶的范围取决于状态:

public function scopeStatus($query, $status)
{
    return $query->where('status', '=', $status);
}

我用以下方法建立我的啤酒索引:

    $kegs = Keg::status($status)->get();
    $beers=[];
    foreach ($kegs as $keg){
        $beer = Beer::find($keg->beer_distribution->beer_id);
        $distributor = Distributor::find($keg->beer_distribution->distributor_id);
        $beers[]=[
        'beer' => $beer,
        'keg' => $keg,
        'distributor' => $distributor];
    }

    return $beers;

我知道这是一个缓慢的查询,但我不确定如何在单个查询中执行此操作。有没有办法让我跑得更快?

一些相关型号代码:

class Beer extends Eloquent {

    public function distributors()
    {
            return $this->belongsToMany('Distributor', 'beer_distributions');
    }



class BeerDistribution extends Eloquent {

    protected $fillable = ['beer_id', 'distributor_id'];

    public function kegs()
    {
        return $this->hasMany('Keg', 'beer_distribution_id');
    }



class Distributor extends Eloquent {

  public function beers()
  {
      return $this->belongsToMany('Beer', 'beer_distributions');
  }



class Keg extends Eloquent {

  public function scopeStatus($query, $status)
  {
    return $query->where('status', '=', $status);
  }

  public function beerDistribution()
  {
    return $this->belongsTo('BeerDistribution');
  }

}

【问题讨论】:

  • 你见过HasManyThrough吗?
  • 如果我为每个与啤酒相连的经销商有很多小桶,这会起作用吗?

标签: mysql laravel orm eloquent pivot


【解决方案1】:

所以我发现我真正需要做的是将我的查询构建关系添加到我的 Keg 模型(这是关系嵌套中最先“向下”的),然后使用预加载!

我现在像这样构建我的啤酒索引:

$beers=[];
foreach (Keg::status($status)
    ->with('kegsize', 
        'beerDistribution.beer.brewery',
        'beerDistribution.beer.style', 
        'beerDistribution.distributor')->get() as $keg){
  $beers[]=$keg;
}
return $beers;

这使我减少到惊人的总共 10 个查询。

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 2019-07-22
    • 2015-06-24
    • 1970-01-01
    • 2020-11-03
    • 2020-08-09
    • 2011-02-06
    • 2012-04-07
    相关资源
    最近更新 更多