Как правильно приклеить комментарии к новостям?

Возникла необходимость добавления комментариев к новостям, но как правильно это реализовать в Larvel я не совсем понимаю. Реализовал я это вот таким образом (код ниже), но подумал и решил, что это скорее всего не верное решение в плане логики.

В общем все делал в том же контроллере и модели, которая отвечает за вывод новостей.

Сделал так. Взял и в TicketController, который отвечает за вывод постов написал следующий код (ниже будет весь код тикет контроллера, но с пояснениями).

<?php

class TicketController extends BaseController {
    
    public static function Index(){
        $tickets = Site::selectTicket();
         return View::make('cabinet.tickets')->with(['tickets' => $tickets]);
    }
    
    public static function getTicket($id){
        $id = (int)$id;
        $comments = Ticket::getComment($id); // Принимаю комментарии из бд
        $show_ticket = Ticket::get($id); // Принимаю новость из бд
        return View::make('cabinet.show_ticket')->with(['show_ticket' => $show_ticket, 'comments' => $comments]);
    }

    // Добавление тикета
    public function addTicket(){
        
        $data = Input::all();
        
        $rules = [
          'title' => 'required|min:10', 
          'description' => 'required|min:10'
        ];
        
        $val = Validator::make($data, $rules);
        
        if($val->fails()){
            
            return Redirect::back()->withErrors($val, 'addticket');
            
        }
        
        $ticket = Ticket::add($data);
        
         if($ticket instanceof Exception){
            return 'Ошибка при добавлении тикета';
        }
        
        return Redirect::to('/cabinet');
        
    }
    
    
    // Добавление тех самых комментариев к новости
    public function addComment(){
        
        $data = Input::all();
        
        $rules = [
          'description' => 'required|min:10',
        ];
        
        $val = Validator::make($data, $rules);
        
        if($val->fails()){
            
            return Redirect::back()->withErrors($val, 'addComm');
            
        }
        
        $ticket = Ticket::addComm($data);
        
         if($ticket instanceof Exception){
            return 'Ошибка при добавлении комментария';
        }
        
        return Redirect::to('/cabinet');
    }
        
}


Ну и собственно сама модель Ticket.

<?php

class Ticket extends Eloquent {

    public static $unguarded = true;

    //Получаем все тикеты из бд
    public static function selectTicket() {
        $tickets = Ticket::where('owner', '=', Auth::user()->email)->orderBy('title', 'desc')->take(3)->get();
        return $tickets;
    }

    //Получаем определенный тикет методом GET
    public static function get($id) {
        $show_ticket = Ticket::where('id', '=', $id)->firstOrFail();
        return $show_ticket;
    }

    // Получаем комментарии к тикету из базы данных
    public static function getComment($id) {
        $comments = DB::select('select * from tickets_comments where ticket_id = ?', [$id]);
        return $comments;
    }

    // Добавляем тикет
    public static function add($data) {

        try {
            $ticket = Ticket::create([
                        'title' => $data['title'],
                        'description' => $data['description'],
                        'owner' => Auth::user()->email
            ]);
        } catch (Exception $ex) {
            return $ex;
        }

        return $ticket;
    }

    // Добавляем комментарий к тикету
    public static function addComm($data) {

        try {            
           $ticket = DB::insert('insert into tickets_comments (ticket_id, description, owner) values (?, ?, ?, ?)'
                    , [1, $data['description'], Auth::user()->email]);
            
        } catch (Exception $ex) {
            return $ex;
        }

        return $ticket;
    }

}


Хотелось бы услышать советы о том, как все это реализовать по другому (по уму). Думал создать отдельный котроллер для коментов + отдельную модель, но как потом выводить комментарии я не знаю. Буду очень благодарен за любую помощь.
  • Вопрос задан
  • 2369 просмотров
Пригласить эксперта
Ответы на вопрос 2
Пользуйтесь возможностями Eloquent - устанавливайте связи.

Тикеты
Таблица БД: tickets
Модель: Tiket
Отношения: Имеет много комментариев

Комментарии
Таблица: comments
Модель: Comment
Отношения: Принадлежат Тикетам (belongsTo)

Прописываете всё и потом, чтобы получить статью с комментариями:
$ticket = Ticket::with('comments')->find($ticketId);


Комментарии можно будет достать через
$ticket->comments

В общем, прочитайте мануал - там всё, что Вам нужно описано.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Есть два варианта научиться чем-нибудь:
- либо прочитать книжку
- либо освоить на примере

ТЫ НЕ СПОСОБЕН НА ОБА

Прои взгляде на несчастную модель на глаза наворачиваются кровавые слезы.
Более-менее современная технологичная установка попросту изуродована ударами варварской дубины. НУ ХОТЯ БЫ ПОСМОТРЕТЬ, КАК СДЕЛАНО В СОСЕДНЕМ МЕТОДЕ и не лепить SQL руками можно было? Дай классической похапе-обезьяне Ларавель - она и из него сделает привычную mysql_query.

Чтобы хоть как-то реабилитироваться, ты должен явиться к работодателю, признаться, что обманул его и ни бельмеса не смыслишь в ларавеле. После этого садишься изучать хотя бы Code Bright, и только после того как закончил книгу и выполнил все примеры, можешь начинать пытаться лезть в чужой код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы