Запросить результаты авторизованного пользователя в laravel

В настоящее время у меня создана система тикетов, и я хотел бы, чтобы пользователи просматривали статус своих открытых и закрытых тикетов.

Я могу запросить базу данных и получить все билеты для отображения, но я хочу, чтобы показывались только билеты зарегистрированных пользователей. Как бы я этого добился. Я занимаюсь этим несколько дней, и я в растерянности.

Что у меня есть:

МАРШРУТ (возвращает 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

Где переменная $id определяется в этом пункте 'user_id', '=', $id?

Ben D 08.04.2018 23:09

вам нужны отношения, проверьте это: laravel.com/docs/5.6/eloquent-relationships#many-to-many

Hussein 08.04.2018 23:12

Я пытаюсь сопоставить id пользователя Auth с user_id в таблице билетов.

daugaard47 08.04.2018 23:12

Вы можете показать пользователям и билетные столы?

Hussein 08.04.2018 23:13

@echo - да, но я не вижу, где на самом деле определяется переменная $id ... вы хотели написать $id = Auth::user('id'); в строке над ней? (а не перезаписывать ваше значение для $ticketId)?

Ben D 08.04.2018 23:16

@BenD да, извиняюсь, это именно то, что я имел в виду.

daugaard47 08.04.2018 23:19

@Hussein Я добавил изображение стола

daugaard47 08.04.2018 23:20

круто, как сказал @Sacha

Hussein 08.04.2018 23:21

@echo Я не уверен, понимаете ли вы, о чем я говорю, но в этом коде есть явная ошибка. $id нигде не определен. Похоже, у вас есть множество проблем (похоже, вы пытаетесь использовать определенный маршрут ресурса для возврата списка, что очень сбивает с толку), но первое, что нужно сделать, это исправить эту плохую переменную.

Ben D 08.04.2018 23:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
9
1 140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас уже есть модель билета, но вы используете фасад БД для запроса таблицы билетов.

Вместо этого свяжите Билеты с Пользователи через отношения один-ко-многим.

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 и пытаюсь осмыслить все это.

daugaard47 08.04.2018 23:42

Это войдет в ваш контроллер билетов. Я обновлю свой ответ, чтобы показать, как можно получить индивидуальный билет.

Sacha 08.04.2018 23:48

эй, у меня есть последний вопрос, если вы не против. Я все время получаю ошибку Call to undefined function App\Http\Controllers\user(). Как мне это исправить? Это происходит здесь. if ($ticket->user_id != user()->id) {

daugaard47 09.04.2018 02:48

@echo это if (auth()->user()->id != $ticket->user_id)

Hussein 09.04.2018 05:31

Другие вопросы по теме