Красноречивый запрос для получения зарегистрированного события одним пользователем - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 4 таблицы, подобные следующей:

users
 - id
 - name
 - others
organizations
 - id
 - others
events
 - id
 - organization_id
 - title
 - others
participatings (intermediate table for table organizations and events)
 - user_id
 - event_id

Таким образом, пользователь может зарегистрироваться на некоторые события, а событие может иметь несколько пользователей. Организация может создать несколько событий. Когда пользователь входит в систему, он может видеть некоторые события, которые он зарегистрировал. TheProblem: Я хочу написать запрос, используя eloquent (предпочтительно) или построитель запросов в Laravel, чтобы получить события, которые зарегистрировал пользователь. так что каждый пользователь может регистрироваться на некоторые события и видеть события, которые он зарегистрировал на одной странице. до сих пор я написал сырой sql. Я считаю, что это должно быть так (еще не попробовал):

select events.*, organizations.id, organizations.name from events join organizations on events.organization_id = organization.id where events.id in (select event_id from participatings where user_id = 1)

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

Моя модель выглядит так:

Event.php
----------------------
class Event extends Model{
    public function organization(){
        return $this->belongsTo('App\Organization');
    }

    public function users(){
        return $this->belongsToMany('App\User', 'participatings');
    }
}


User.php
--------------------
class User extends Authenticatable{
use Notifiable;

    public function events(){
        return $this->belongsToMany('App\Event', 'participatings');
    }

}


Organization.php
----------------------
class Organization extends Authenticatable{
use Notifiable;

    public function events(){
        return $this->hasMany('App\Event');
    }
}

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

в пользовательской модели

class User extends Authenticatable
{
    public function participatings()
    {
        return $this->hasMany(Participating::class, 'user_id')->with('organization');
    }

 }

в участвующей модели

class Participating extends Model
{
    public function organization()
    {
        return $this->belongsTo(organization_id::class, 'id','organization_id')->with('events');
    }

 }

в модели организации

class Organization extends Model
{
    public function events()
    {
        return $this->belongsTo(Event::class,'organization_id','id');
    }

 }

теперь вам нужно только позвонить User::with('participatings') и это будет с участием, которое идет с организацией и, наконец, с событиями

0 голосов
/ 01 ноября 2018

Таблица участия - это отношение «многие ко многим» между пользователем и событием not organization, you can get the organization later by the relation between it and event.

Итак, теперь участвующая таблица является псевдонимом или переименовывается в event_user таблицу, которая включает user_id и event_id.

User: events() belongsToMany(Event::class); 
Event: users() belongsToMany(User::class);
Organization: events() hasMany(Event::class);
Event:: organization() belongsTo(Organization);

Чтобы привязать события к конкретному пользователю, я бы запросил это

auth()->user()->events;

auth()->user()->events()->with('organization')->get(); // loading organization

auth()->user()->events()->where(function($query){
    $query->where(); // querying events
})->get();

auth()->user()->events()->whereHas('organization', function($query){
    $query->where(''); // querying organizations
})->get();
0 голосов
/ 01 ноября 2018

Предполагая, что вы создали правильные отношения принадлежности для пользователя и организаций. Используйте следующий запрос для фильтрации организации, в которой зарегистрирован пользователь с указанным идентификатором, а затем присоедините его к событиям, чтобы получить события этой организации.

Organisations::with('users')
    ->leftjoin('events', 'events.organization_id', '=', 'organizations.id')
    ->whereHas('users', function ($q) use ($userId) {
        $q->where('id', $userId);
    })->get();
...