Laravel雄辩查询权利数据

时间:2016-05-31 20:45:01

标签: php mysql laravel eloquent

我对laravel和eloquent相当新。

我有2个表threadsmessages您可以在下面的链接中看到结构:

线程

threads

消息

messages

现在,我的目标是仅查询来自消息表中与登录用户具有相同user_id的表线程中的线程。

有没有办法通过雄辩的方式做到这一点,还是我必须为此写一个查询?

我目前得到这样的所有主题:

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

但是这会带来安全问题,因为如果你改变路线中的id,你可以去任何线程。

修改

我目前的节目功能:

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');
        }

    }

我需要一种方法来检查$ thread是否在$ threads内。

2 个答案:

答案 0 :(得分: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');
}

在Thread模型中:

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

现在您可以在控制器中执行以下操作:

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

现在您拥有当前登录用户的所有线程。 我不确定我的问题是否正确,所以请求离开。

编辑: 你可以这样检查:

$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
}

答案 1 :(得分:1)

有一种方法可以通过调用来获取当前用户的ID:

$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

从那里,您可以提取$ messages变量并获取所有thread_ids,然后,您可以在Thread模型上使用find方法,如下所示:

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