查询 'across' 数据透视表 table
Querying 'across' pivot table
我有两个模型,beers 和 distribution,它们是多对多的关系。枢轴模型 hasMany
个小桶,其中包含一些与啤酒相关的信息,例如价格和状态。当我建立我的啤酒索引时,我需要啤酒模型、分销商模型和小桶模型的所有信息。我想弄清楚的是如何以有效的方式查询所有信息。这是我当前的查询:
Keg 的范围在状态上:
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 模型(这是关系嵌套中最父亲 'down')上添加我的查询构建关系,然后使用预加载!
我现在像这样建立我的啤酒索引:
$beers=[];
foreach (Keg::status($status)
->with('kegsize',
'beerDistribution.beer.brewery',
'beerDistribution.beer.style',
'beerDistribution.distributor')->get() as $keg){
$beers[]=$keg;
}
return $beers;
这使我的查询总数达到惊人的 10 个。
我有两个模型,beers 和 distribution,它们是多对多的关系。枢轴模型 hasMany
个小桶,其中包含一些与啤酒相关的信息,例如价格和状态。当我建立我的啤酒索引时,我需要啤酒模型、分销商模型和小桶模型的所有信息。我想弄清楚的是如何以有效的方式查询所有信息。这是我当前的查询:
Keg 的范围在状态上:
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 模型(这是关系嵌套中最父亲 'down')上添加我的查询构建关系,然后使用预加载!
我现在像这样建立我的啤酒索引:
$beers=[];
foreach (Keg::status($status)
->with('kegsize',
'beerDistribution.beer.brewery',
'beerDistribution.beer.style',
'beerDistribution.distributor')->get() as $keg){
$beers[]=$keg;
}
return $beers;
这使我的查询总数达到惊人的 10 个。