首页 > 解决方案 > 数据库设计雄辩问题与查询

问题描述

我需要创建一个管理足球表的应用程序

我实际上有一张桌子,用来存储两支球队的比赛

match :
-id
-dt_math
-club_home_id
-club_visitor_id

每支球队都有一张表格来创建球员名单。

所以我做了什么,我创建了表 match_sheet 来存储来自团队的两张表。

match_sheet :
-id
-match_id

为了将玩家存储在每张表中,我创建了表 match_sheet_player

match_sheet_player:
-id
-match_sheet_id
-player_id

现在我只需要显示在我的视图中拥有两张表的匹配项。我不知道如何做到这一点。

我提出的第一个查询是:

  $matchs_sheets = MatchSheet::all();

    $matchs = Match::whereIn('id', $matchs_sheets->pluck('match_id'))->orderByDesc('dt_match')->paginate(5);

但这会返回我的比赛,即使有一张纸但不是两张纸。如果有两张床单,我真的需要出示比赛单。

更新 :

这里我的 math_sheet 数据有两条记录为 1659。1659 是匹配的 id。所以我只想显示比赛 1659 而不是 1649 因为这场比赛只有一个记录 在此处输入图像描述

标签: databaselaraveleloquent

解决方案


假设您的模型关系设置正确,您可以要求 Laravel 仅在相关模型的计数至少为 2 时使用has(). 例如:

$matches = Match::whereIn('id', $ids)->has('matchSheet', '=', 2)...

您的关系应设置为例如:

// on Match model
public function matchSheets()
{
    return $this->hasMany(MatchSheet::class);
}

// on MatchSheet model
public function match()
{
    return $this->belongsTo(Match::class);
}

此处的文档:https ://laravel.com/docs/5.6/eloquent-relationships#one-to-many - 我真的建议通读它们,它们最终会为您节省大量时间!


推荐阅读