Php Laravel相当于QueryBuilder查询
我有一个Laravel 7项目和此数据库结构:Php Laravel相当于QueryBuilder查询,php,mysql,laravel,eloquent,laravel-query-builder,Php,Mysql,Laravel,Eloquent,Laravel Query Builder,我有一个Laravel 7项目和此数据库结构: races participants bibs coords ------- -------------- ------ -------- id id id id race_id bib_id bib_id [
races participants bibs coords
------- -------------- ------ --------
id id id id
race_id bib_id
bib_id [...]
这些关系是:
1 race => N participants ( races.id = participants.race_id )
1 participant => 1 bib ( participants.bib_id = bibs.id )
1 bib => N coords ( bibs.id = coords.bib_id )
所以它也意味着:participants.bib_id=coords.bib_id
我想得到所有与特定种族相关的坐标。
我使用查询生成器的方式如下所示:
class Race extends Model
{
public function getCoords()
{
return Coord::join('participants', 'participants.bib_id', '=', 'coords.bib_id')
->where('participants.race_id', $this->id)->select('coords.*')->get();
}
}
在这里我可以做到:
$coords = Race::find(1)->getCoords();
它按预期工作,但我正在寻找一种使用雄辩的方法,以便更容易与更多的关系和内容链接。我尝试了很多与
有关的东西,但是没有任何效果。我想知道这是否可能
// Race
public function participants()
{
return $this->hasMany(Participant::class);
}
// Participant
public function bib()
{
return $this->belongsTo(Bib::class);
}
public function race()
{
return $this->belongsTo(Race::class);
}
// Bib
public function coords()
{
return $this->hasMany(Coord::class);
}
// Coord
public function bib()
{
return $this->belongsTo(Bib::class);
}
现在,你想要的是找到一个给定种族的坐标
$race=race::find($id)->with('particients.bib.coords')代码>
现在,从中提取coords
$coords = $race->participants->map(function($participant){
return $participant->bib->coords;
});
让我在下面的评论中发布。干杯 我需要编写Race::with('particients.bib.coords')->find(1)
,而不是Race::find($id)->with('particients.bib.coords')
。但是这很酷。你认为这个解决方案会导致性能问题吗?想象一下,大约有500名参与者和100000名合作伙伴(总数)。获取coords的请求将在Openlayers地图上使用,该地图预计将拥有大约10000名用户。我不知道网络和数据库服务器的费用是多少。此外,在这张地图上,会有另一个http请求来刷新所有参赛者最后的“coords”(在时间戳列上会有一个过滤器)。像每分钟一次AJAX调用。如果有大约1万名用户在观看地图,您认为您的建议方式会有问题吗?是的,目前您正在从每个关系中选择所有列。请浏览此链接()。好的,如果我遵循你所写的,我应该考虑把我的查询生成器函数保留在这种操作中,因为它减少了SQL查询的数量(从我的测试= >从4减少到1(但是有一个连接))。我应该和select()
一起做,以便只获取我需要的列。是这样吗?