首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法将嵌套集合中的对象计数作为laravel中的属性附加?

是否有方法将嵌套集合中的对象计数作为laravel中的属性附加?
EN

Stack Overflow用户
提问于 2022-01-19 19:39:53
回答 1查看 314关注 0票数 0

我是拉勒维尔的新手,而且特别能言善辩。我有一个比赛模型,这场比赛有目标

代码语言:javascript
复制
class Match extends Model
{
    use HasFactory;

    public function goals()
    {
        return $this->hasMany(Goal::class, 'match');
    }

}

我是这样从财务总监那里打的:

代码语言:javascript
复制
public function matchesWithGoals()
    {
        $matches = Match::with('goals')->get();
        return compact('matches');
    }

这是返回每一场比赛与它自己的目标集合。目前为止一切都很好。

代码语言:javascript
复制
{
"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 )对嵌套集合中的元素进行计数的直接方法,并附加属性,以便预期的结果如下所示:

代码语言:javascript
复制
{
"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中,是因为我不仅仅是在显示分数。匹配还有其他关系,如名册,我的目标是学习如何处理这些嵌套关系集合,并将这些结果作为属性追加。总结一下高尔夫球似乎是最基本的情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-19 20:22:47

有几种方法可以做到这一点,所以我将提供一个可能的解决方案。

您可以查看Laravel https://laravel.com/docs/8.x/eloquent-mutators#defining-an-accessor

在您的例子中,您可以在您的匹配模型上拥有如下功能:

代码语言:javascript
复制
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
}

然后,您可以执行两项操作之一,将此数据包含在集合中。

  1. $appends = ['result', 'goals_team_a', 'goals_team_b'];添加到匹配模型的顶部。这将在将这些值转换为数组或JSON时将其附加到集合中。谷歌“laravel附加”以获取更多信息。

  1. 当您有一个匹配作为一个雄辩的对象时,只需调用$match->goals_team_a,它就会动态地进行计算。使用这种方法时,您应该注意n+1问题,因为它将运行getGoalsTeamAAttribute函数中的任何数据库查询。在运行$match->goals_team_a.

之前,您需要确保自己是延迟加载(->with('goals'))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70776780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档