我对laravel和eloquent相当新。
我有2个表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内。
答案 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, ...]);