2016-05-31 4 views
1

Я довольно новичок в laravel и красноречивее.Laravel eloquent query right data

У меня есть 2 таблицы threads и messages вы можете увидеть структуру в ссылках ниже:

нитей

threads

сообщения

messages

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

Есть ли способ сделать это посредством красноречия или мне нужно написать запрос для этого?

я в настоящее время получают все нити так:

$thread = Thread::findOrFail($id); 

Но это дает проблемы с безопасностью, так как вы можете пойти в любой поток, если вы измените идентификатор в моем маршруте.

EDIT

Моя текущая шоу функция:

public function show($id) 
    { 
     $currentUserId = Auth::user()->id; 
     $threads = Thread::forUser($currentUserId)->latest('updated_at')->get(); 

     try { 
      $thread = Thread::findOrFail($id); 
     } catch (ModelNotFoundException $e) { 
      Session::flash('error_message', 'Oops, not found.'); 
      return redirect('messages'); 
     } 


     if(array_has($threads, $thread)){ 
      $users = User::whereNotIn('id', $thread->participantsUserIds($currentUserId))->get(); 
      $thread->markAsRead($currentUserId); 
      return view('messenger.show', compact('thread', 'users')); 
     }else{ 
      Session::flash('error_message', 'Oops, not found.'); 
      return redirect('messages'); 
     } 

    } 

Мне нужен способ, чтобы проверить, если $ нить внутри $ нитей.

+0

Что вы имеете в виду ниткой? – Codearts

+0

В потоке вы можете иметь несколько сообщений. Так, например, я создаю поток «обсуждение1», и в этом обсуждении может быть несколько сообщений. Поток похож на dm между двумя пользователями. – Cruzito

+0

@Codearts Надеюсь, это имеет смысл, что я пытаюсь сказать :) – Cruzito

ответ

3

Если вы хотите использовать красноречивым вы должны сначала определить отношения. Одно сообщение принадлежит нитью и пользователю.Вот как определить отношения: Внутри модели сообщения:

public function user() 
{ 
    return $this->belongsTo('App/User'); //User model 
} 

public function thread() 
{ 
    return $this->belongsTo('App/Thread'); //Thread model 
} 

Чтобы определить обратный вы делаете следующее: Внутри пользователя модели:

public function threads() 
{ 
    return $this->hasMany('App/Thread'); 
} 

Внутри модели резьбы:

public function messages() 
{ 
    return $this->hasMany('App/Message'); 
} 

Теперь вы можете сделать следующее в своем контроллере:

$threads = Auth::user()->threads; 

Теперь у вас есть все темы по данному пользователю. Я не уверен, правильно ли получил вопрос, поэтому попросите прощения.

Edit: Вы можете проверить так:

$thread = Thread::find($id); 
$isCurrentUserThread = false; 
foreach(Auth::user()->threads as $currentUserThread) { 
    if($currentUserThread->id == $thread->id) { 
     $isCurrentUserThread = true; 
     //$thread belongs to the current user 
    } 
} 

if($isCurrentUserThread) { 
    //the thread belongs to the current user 
} else { 
    //it doesn't belong to the current user 
} 
+0

Дело в том, что у меня нет моделей, поскольку я использую этот пакет: https://github.com/cmgmyr/laravel-messenger, но я нашел функцию, в которой они используют '$ threads = Thread :: forUser ($ currentUserId) -> последняя ('updated_at') -> get(); 'как это, например. Теперь я пытался проверить, есть ли массив, который проверяется с идентификатором маршрута, находится в массиве $ threads – Cruzito

+0

Я обновил OP с помощью моей функции, если вы хотите, – Cruzito

+0

Ну, какая ошибка у вас? – Codearts

1

Существует способ, чтобы получить идентификатор текущего пользователя по телефону:

$logged_in_user = Auth::user()->id 

Просто убедитесь, чтобы включить эту часть где-то на вершине:

use Illuminate\Support\Facades\Auth; 

Затем, вы можете просто получить все сообщения где user_id соответствует зарегистрированному пользователю ...

$messages = App\Message::where('user_id', '=', $logged_in_user)->get(); 
// the get() method will get all messages, not just one 

Оттуда вы можете извлечь $ m essages переменной и захватить все thread_ids, которые затем можно использовать метод найти на модели Thread, как следующее:

$threads = App\Thread::find([1, 2, 3, 4, ...]);