Laravel Eloquent 3 Table Join Query - PullRequest
       11

Laravel Eloquent 3 Table Join Query

0 голосов
/ 24 августа 2018

У меня есть 3 миграции

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

Schema::create('events', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('owner');
        $table->dateTime('start_date');
        $table->dateTime('end_date');
        $table->dateTime('alert_date');
        $table->string('title');
        $table->text('description');
        $table->string('local');
        $table->timestamps();

        $table->foreign('owner')->references('id')->on('users');
    });

Schema::create('shares', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('host');
        $table->unsignedInteger('guest');
        $table->boolean('host_answer')->nullable();
        $table->boolean('guest_answer')->nullable();;
        $table->timestamps();

        $table->foreign('host')->references('id')->on('users');
        $table->foreign('guest')->references('id')->on('users');
    });

Тогда у меня установлены отношения на соответствующих моделях.

Пользователи:

public function events()
{
    return $this->hasMany(Event::class);
}

public function host()
{
    return $this->hasMany(Share::class);
}

public function guest()
{
    return $this->hasMany(Share::class);
}

Событие:

public function userOwner()
{
    return $this->belongsTo(User::class, 'owner');
}

Поделиться:

public function userGuest()
{
    return $this->belongsTo(User::class, 'guest');
}

Мне нужны все отдельные события, когда выполняется хотя бы одно из 3 условий:

1- events.owner = $ someUserId.

2- shares.host = $ someUserId и shares.guest_answer = 1.

3- shares.guest = $ someUserId и shares.guest_answer = 1.

Если бы это был просто SQL, я думаю, я мог бы сделать запрос ... но я не знаю, поэтому у меня возникли некоторые проблемы с моим запросом.

Эточто я получаю:

 $events = Event::join('users', 'events.owner', '=', 'users.id')
                ->join('shares', 'users.id', '=', 'shares.host')
                ->where  ([[ 'events.owner', $userId ]])
                ->orWhere([[ 'shares.host', $userId],
                           [ 'shares.guest_answer', '1' ]])
                ->orWhere([[ 'shares.guest', $userId],
                           [ 'shares.guest_answer', '1' ]])
                ->paginate(10);

Но этот запрос просто возвращает события, где events.owner = $ userId.

Большое спасибо за потраченное время.

1 Ответ

0 голосов
/ 25 августа 2018
    $userId = Auth::id();

    $events = Event::join('users'       , 'events.owner', '=', 'users.id')
                   ->join('shares as sg', 'users.id'    , '=', 'sg.guest')
                   ->join('shares as sh', 'users.id'    , '=', 'sh.host' )

                   ->Where([   ['events.owner'    , '=', $userId] ])

                   ->orWhere([ ['sg.host'         , '=', $userId] ,
                               ['sg.guest_answer' , '=', '1']     ])

                   ->orWhere([ ['sh.guest'        , '=', $userId] ,
                               ['sh.guest_answer' , '=', '1']     ])

                    ->paginate(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...