В настоящее время у меня есть система тикетов, и я хотел бы, чтобы пользователи могли просматривать статус их открытых и закрытых билетов.
Я могу запросить базу данных и получить все билеты для отображения, но я хочу, чтобы показывались только зарегистрированные пользователи. Как бы я этого достиг. Занимался этим уже несколько дней, и я в растерянности.
Что я имею:
ROUTE (Это возвращает 404 из-за {ticketId}
) / Примечание: если я удалю {ticketId}
из маршрута я получаю ошибку типа: *Too few arguments to function App\Http\Controllers\TicketsController::openTickets(), 0 passed and exactly 1 expected"*
Route::get('/tickets/open-tickets/{ticketId}','TicketsController@openTickets')->name('open-tickets');
БИЛЕТЫ КОНТРОЛЛЕР
public function openTickets($ticketId){
$tickets=Classified::find($ticketId);
$ticketId = Auth::user('id');
$tickets = DB::table('tickets')->orderBy('st_id', 'DESC')->where('status', '=', 'OPEN')->where('user_id', '=', $id)->paginate(4);
return view('tickets.open-tickets',compact('tickets'));
Билет МОДЕЛЬ
class Ticket extends Model
{
use Notifiable, HasPermissionsTrait;
protected $ticketId = 'st_id';
protected $guarded=[];
protected $dispatchesEvents = [
'created' => Events\NewTicket::class
];
}
РАБОЧИЙ ВОПРОС ДЛЯ ОТОБРАЖЕНИЯ ВСЕХ БИЛЕТОВ
public function openTickets(){
$tickets = DB::table('tickets')->orderBy('st_id', 'DESC')->where('status', '=', 'OPEN')->paginate(4);
return view('tickets.open-tickets',compact('tickets'));
Я должен отметить, что я изменил свой идентификатор на st_id в таблице заявок, так как я использую идентификатор для отображения номера билета, как это 201804001
Опять же, я просто ищу решение, чтобы вошедший в систему пользователь мог просматривать свои билеты, а НЕ все билеты в базе данных.
У вас уже есть модель Ticket, но вы используете фасад DB для запроса таблицы заявок.
Вместо этого, ассоциировать Билеты с пользователей через отношения один ко многим.
class Ticket extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
В вашем классе пользователя:
public function tickets()
{
return $this->hasMany(Ticket::class);
}
Теперь вы можете сделать $user->tickets()->where('status', 'OPEN')->get();
чтобы получить все открытые билеты для этого пользователя.
Еще дальше, вы можете добавить объем к модели Билета.
В вашем классе билетов:
public function scopeOpen($query)
{
return $query->where('status', 'OPEN');
}
Это позволит вам сделать ваши запросы более беглыми:
$user->tickets()->open()->get();
Чтобы связать тикет с пользователем, просто сделайте что-нибудь по следующей схеме:
$user->tickets()->save(new Ticket([
'status' => 'open',
'title' => 'Problem logging in',
'body' => 'Lorem ipsum dolor sit amet'
]));
Для получения дополнительной информации об отношениях Eloquent (в частности, отношениях «один ко многим»), см документацию здесь.
Чтобы просмотреть все открытые заявки пользователя, используйте следующий маршрут:
Route::get('tickets/open-tickets/', 'TicketsController@index');
Чтобы показать отдельный билет, вам понадобится следующий маршрут:
Route::get('tickets/open-tickets/{ticket}', 'TicketsController@show')
Используйте следующие методы в вашем TicketsController
:
public function index()
{
// user() is a helper for Auth::user()
$tickets = user()->tickets()->open()->paginate(4);
return view('tickets.open-tickets', compact('tickets'));
}
public function show(Ticket $ticket)
{
// If the ticket does not belong to the logged in user, abort
if ($ticket->user_id != user()->id) {
abort(403, 'This is not your ticket');
}
return view('tickets.show', compact('ticket'));
}
Вы заметите, что show
Метод в вашем контроллере типа подсказки Ticket
модель. Это называется привязкой к модели маршрута, что очень полезно, и вы можете Подробнее об этом читайте здесь.
Может показаться, что я слишком усложняю вещи по сравнению с вашим исходным кодом, но, поверьте мне, лучше понять эти вещи на ранней стадии! Они очень вам помогут во время разработки.
Других решений пока нет …