Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel相当于QueryBuilder查询_Php_Mysql_Laravel_Eloquent_Laravel Query Builder - Fatal编程技术网

Php Laravel相当于QueryBuilder查询

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 [

我有一个Laravel 7项目和此数据库结构:

 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()
一起做,以便只获取我需要的列。是这样吗?