Laravel -将两个关系Map为一个

svmlkihl  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(184)

我有一个模型events,我存储有关事件的信息。每个事件都属于一个group。事件组的users能够回复他们是否参加该事件。此信息保存在单独的表event_replies中。
现在,通过一个简单的关系,我可以得到事件的所有回复:

public function replies()
{
    return $this->hasMany('App\Models\EventReply','event_id','id');
}

或者我可以让所有的用户

public function users()
    {
        return $this->hasMany('App\Models\User','group_id','group_id');
    }

但是加载回复并不会加载所有没有回复的用户。
我想要的是:该关系应返回组的所有用户。如果他们回答,则返回值,如果没有:该值应为空。
是否可以将用户关系与企业关系合并/Map?

编辑

下面是一个JSON结果应该是什么样子的示例:

[ 
   { 
      "id":1,
      "group":1,
      "name":"Event 1",
      "replies":[ 
         { 
            "name":"user 1",
            "reply":1 // replied
         },
         { 
            "name":"user 2",
            "reply":0 // replied
         },
         { 
            "name":"user 3",
            "reply":null // NO reply in event_replies
         },
         { 
            "name":"user 4",
            "reply":1 // replied
         }
      ]
   }
]

编辑2

Events-表:

id: int
name: String
group_id: int

Users-表:

id: int
name: String
group_id: int

event_replies-表:

event_id: int
user_id: int

就像我之前说的:我的目标是获得一个包含所有属于组--〉user.group_id = event.group_id的用户的事件。如果他们回复了,Reply应该在user对象中。如果不是-用户对象中的Reply对象应该为null。
对于普通的SQL查询,我会加入所有用户,并留下加入回复。

osh3o9ms

osh3o9ms1#

在EventReply模型中获取用户回复并定义用户关系

public function replies()
{
   return $this->hasMany('App\Models\EventReply','event_id','id')->with('user');
}

EventReply.php

public function user()
{
    return $this->hasOne(User::class);
}
nnvyjq4y

nnvyjq4y2#

如果我理解正确的话,您希望“急切地加载”您的Event模型,其中嵌套了users及其各自的replies
获取单个事件:

$event = Event::find(1)->with('users.replies')->get();

获取所有事件:

$events = Event::all()->with('users.replies')->get();

以下是Laravel关于eager loading的文档:

  • www.example.com

相关问题