В настоящее время у меня создана система тикетов, и я хотел бы, чтобы пользователи просматривали статус своих открытых и закрытых тикетов.
Я могу запросить базу данных и получить все билеты для отображения, но я хочу, чтобы показывались только билеты зарегистрированных пользователей. Как бы я этого добился. Я занимаюсь этим несколько дней, и я в растерянности.
Что у меня есть:
МАРШРУТ (возвращает 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
Опять же, я просто ищу решение, чтобы зарегистрированный пользователь просматривал свои билеты, а НЕ все билеты в базе данных.
вам нужны отношения, проверьте это: laravel.com/docs/5.6/eloquent-relationships#many-to-many
Я пытаюсь сопоставить id пользователя Auth с user_id в таблице билетов.
Вы можете показать пользователям и билетные столы?
@echo - да, но я не вижу, где на самом деле определяется переменная $id ... вы хотели написать $id = Auth::user('id'); в строке над ней? (а не перезаписывать ваше значение для $ticketId)?
@BenD да, извиняюсь, это именно то, что я имел в виду.
@Hussein Я добавил изображение стола
круто, как сказал @Sacha
@echo Я не уверен, понимаете ли вы, о чем я говорю, но в этом коде есть явная ошибка. $id нигде не определен. Похоже, у вас есть множество проблем (похоже, вы пытаетесь использовать определенный маршрут ресурса для возврата списка, что очень сбивает с толку), но первое, что нужно сделать, это исправить эту плохую переменную.






У вас уже есть модель билета, но вы используете фасад БД для запроса таблицы билетов.
Вместо этого свяжите Билеты с Пользователи через отношения один-ко-многим.
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. Это называется привязкой модели маршрута, что очень полезно, и вы можете подробнее об этом здесь.
Может показаться, что я слишком усложняю по сравнению с вашим исходным кодом, но поверьте мне, лучше понять эти вещи на ранней стадии! Они вам очень помогут во время разработки.
Спасибо за помощь, извините за недостаток знаний, но куда подеваться $user->tickets()->where('status', 'OPEN')->get();? В моей модели билета или TicketsController? Довольно новичок в Laravel и пытаюсь осмыслить все это.
Это войдет в ваш контроллер билетов. Я обновлю свой ответ, чтобы показать, как можно получить индивидуальный билет.
эй, у меня есть последний вопрос, если вы не против. Я все время получаю ошибку Call to undefined function App\Http\Controllers\user(). Как мне это исправить? Это происходит здесь. if ($ticket->user_id != user()->id) {
@echo это if (auth()->user()->id != $ticket->user_id)
Где переменная
$idопределяется в этом пункте'user_id', '=', $id?