gpt4 book ai didi

mysql - 查询 'across'数据透视表

转载 作者:行者123 更新时间:2023-11-29 22:40:48 24 4
gpt4 key购买 nike

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

小桶的范围取决于状态:

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');
}

}

最佳答案

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

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

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

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

关于mysql - 查询 'across'数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29360250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com