我是拉勒维尔的新手,而且特别能言善辩。我有一个比赛模型,这场比赛有目标
class Match extends Model
{
use HasFactory;
public function goals()
{
return $this->hasMany(Goal::class, 'match');
}
}我是这样从财务总监那里打的:
public function matchesWithGoals()
{
$matches = Match::with('goals')->get();
return compact('matches');
}这是返回每一场比赛与它自己的目标集合。目前为止一切都很好。
{
"matches": [
{
"id": 13,
"date": "2022-01-05",
"goals": [
{
"id": 2,
"player": 4,
"match": 13,
"team": "b"
},
{
"id": 3,
"player": 13,
"match": 13,
"team": "b"
},
{
"id": 4,
"player": 4,
"match": 13,
"team": "a"
}]
}]}我想做的是,获取每个嵌套的目标集合,基于团队进行累加,并附加自定义属性"goalsTeamA“、"goalsTeamB”、"matchResult“。
我试着分别做这件事,比如,得到所有的比赛,得到所有的进球,并加入他们。但是,看起来应该有一种基于属性(在本例中为team )对嵌套集合中的元素进行计数的直接方法,并附加属性,以便预期的结果如下所示:
{
"matches": [
{
"id": 13,
"date": "2022-01-05"
"goalsTeamA": 1,
"goalsTeamB": 2,
"Result": "b"
},
{
"id": 14,
"date": "2022-01-12"
"goalsTeamA": 3,
"goalsTeamB": 7,
"Result": "b"
}]
}我怎样才能做到这一点?
顺便说一句,我之所以尝试这样做,而不是仅仅将这个列添加到带有分数的DB中,是因为我不仅仅是在显示分数。匹配还有其他关系,如名册,我的目标是学习如何处理这些嵌套关系集合,并将这些结果作为属性追加。总结一下高尔夫球似乎是最基本的情况。
发布于 2022-01-19 20:22:47
有几种方法可以做到这一点,所以我将提供一个可能的解决方案。
您可以查看Laravel https://laravel.com/docs/8.x/eloquent-mutators#defining-an-accessor
在您的例子中,您可以在您的匹配模型上拥有如下功能:
public function getGoalsTeamAAttribute() {
// calculate and return goal count for team A
}
public function getGoalsTeamBAttribute() {
// calculate and return goal count for team B
}
public function getResultAttribute() {
// calculate and return result
}然后,您可以执行两项操作之一,将此数据包含在集合中。
$appends = ['result', 'goals_team_a', 'goals_team_b'];添加到匹配模型的顶部。这将在将这些值转换为数组或JSON时将其附加到集合中。谷歌“laravel附加”以获取更多信息。$match->goals_team_a,它就会动态地进行计算。使用这种方法时,您应该注意n+1问题,因为它将运行getGoalsTeamAAttribute函数中的任何数据库查询。在运行$match->goals_team_a.之前,您需要确保自己是延迟加载(->with('goals'))
https://stackoverflow.com/questions/70776780
复制相似问题