Я создал проект, который позволяет зарегистрированным пользователям создавать сообщения. В таблице сообщений есть столбец под названием post_id
. post_id имеет значение идентификатора пользователя, полученное из Session::get('id')
.
Теперь я хочу получить все сообщения, связанные с вошедшим в систему пользователем, с помощью Post::where('post_id','=',Session::get('id');
Код ниже
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
//use App\Models\User;
use App\Models\Post;
use Session;
class PostController extends Controller
{
public function post(Request $request){
$posts = Post::where('post_id','=',Session::get('id'));
return view('dashboard',['posts' => $posts]);
}
}
в веб.php
use App\Http\Controllers\PostController;
Route::get('/dashaboard',[PostController::class,'post']);
в виде приборной панели
@foreach ($posts as $post)
<tr>
<td>{{$post->post_title}}</td>
<td>{{$post->post_description}}</td>
</tr>
@endforeach
Ошибка
Неопределенная переменная $posts
Я попытался получить зарегистрированные сообщения пользователя. Я хочу получить все сообщения.
вам просто не хватает ->get()
в конце вашего запроса $posts = Post::where('user_id','=',Session::get('id'))->get();
или используйте ответ @jerothor (отношения пользователя и сообщения), о, и измените post_id на user_id ^_^
Итак, ваша установка немного сбивает с толку. Позвольте мне сломать, как вы должны на самом деле настроить это.
В вашей модели User
вы должны определить отношения для сообщений:
public function posts() {
return $this->hasMany(Post::class);
}
В вашей модели Post
вы должны определить отношение для пользователя:
public function user() {
return $this->belongsTo(User::class);
}
В вашей таблице базы данных сообщений вам понадобится целочисленный столбец user_id
, в котором будет храниться идентификатор пользователя сообщения.
После того, как вы выполнили эту настройку, вы сможете получать сообщения всех зарегистрированных пользователей, например:
public function post(Request $request){
$posts = $request->user()->posts;
return view('dashboard',['posts' => $posts]);
}
Небольшая поправка к красноречивому запросу, который вы используете.
$user_id = Session::get('id');
// change post_id into user_id
// and add ->get() to fetch all posts related to user_id
$posts = Post::where('user_id','=', $user_id)->get();
А если у пользователя много постов, например больше 25.
Вы можете использовать пагинацию
$perPage = 25;
$posts = Post::where('user_id','=', $user_id)->paginate($perPage);
https://laravel.com/docs/9.x/pagination#paginating-eloquent-results
Кстати, есть другой способ получить идентификатор пользователя, если этот пользователь вошел в систему.
$user_id = auth()->user()->id;
$user_id = $request->user()->id;
$user_id = auth()->id();
Для входа в систему с идентификатором пользователя
использовать авторизацию; $user_id = Auth::user()->id;
альтернатива session::get(id) использует
auth()->id()
илиauth()->user()->id