Возникла необходимость добавления комментариев к новостям, но как правильно это реализовать в 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;
}
}
Хотелось бы услышать советы о том, как все это реализовать по другому (по уму). Думал создать отдельный котроллер для коментов + отдельную модель, но как потом выводить комментарии я не знаю. Буду очень благодарен за любую помощь.