Выбор правильного отношения eloquent для поиска учащихся, зарегистрированных в событии

#laravel #eloquent

#laravel #eloquent

Вопрос:

У меня есть users таблица

введите описание изображения здесь

У меня есть events таблица

введите описание изображения здесь

У меня есть portal_event_users таблица

введите описание изображения здесь

Я пытаюсь найти всех пользователей и их имена, зарегистрированные для события. Пожалуйста, посоветуйте, какое отношение eloquent мне использовать для доступа к данным пользователя, как показано ниже

 public static function getstudents($event_id) {

        try {
            if ($event_id) {
                $eventobj = AppModelsEvent::find($event_id);
                if (!empty($eventobj)) {
                                        
                    $response = ['users' => $eventobj->students->users];
                    
                    return response()->json($response);
                    
                }
            }
        } catch (Exception $ex) {
            
        }
    }
 

Это то, что я добавил в модель событий

 class Event extends Model
{
    use HasFactory;
    protected $table = 'portal_events';
    
     public function students()
    {
        return $this->hasMany(EventUser::class);
    }
   
}
 

Моя модель EventUser

 class EventUser extends Model
{
    use HasFactory;
    protected $table = 'portal_event_users';
    
      public function users()
    {
        return $this->belongsToMany(User::class,'portal_event_users','event_id','user_id')->withTimeStamps();//,'user_id','event_id');
    }
    
    public function events()
    {
        return $this->belongsToMany(Event::class);
    }
}
 

Ответ №1:

Вы можете напрямую связывать события с пользователями, используя отношения belongstomany и сводную таблицу portal_event_users

 class Event extends Model
{
    use HasFactory;
    protected $table = 'portal_events';
    
      public function users()
    {
        return 
        $this>belongsToMany(User::class,'portal_event_users','event_id','user_id')->withTimeStamps();
    }
     public function students()
    {
        return $this->hasMany(EventUser::class);
    }
   
}
 

затем вы можете вызвать $event-> users для пользователей, связанных с этим событием
подробнее см. https://laravel.com/docs/8.x/eloquent-relationships#many-to-many

кроме того, вам не нужно создавать модель для сводной таблицы, если вам не нужно напрямую обновлять их