database - 数据库设计雄辩问题与查询
问题描述
我需要创建一个管理足球表的应用程序
我实际上有一张桌子,用来存储两支球队的比赛
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 因为这场比赛只有一个记录
解决方案
假设您的模型关系设置正确,您可以要求 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 - 我真的建议通读它们,它们最终会为您节省大量时间!
推荐阅读
- python - 如何在添加另一个时基于列合并DataFrame
- matlab - 在 Matlab GUI 中将动画保存为 gif
- javascript - ::selection span 没有实际标签容器高,只有 text 高
- php - PHP 文件内容为字符串 - 保持格式
- math - 除了直径(G)=半径(G)的完整图表之外,还有其他图表示例吗?
- angular - DevExtreme 组件在事件参数中不可用
- arrays - Bash RegEx 并将命令存储到变量中
- javascript - 在 AJAX GET 请求中退出 setTimeout 循环
- openssl - OpenSSL:将具有值的自定义字段作为对象添加到 CSR
- ios - 在 iOS 模拟器上解析浮点数失败