У меня следующая проблема. Надеюсь, мой подход не совсем неправильный, не стесняйтесь советовать.
У меня модель класса Chat.php
protected $skip;
protected $take;
protected $agreements;
protected $chat;
public function getSkip()
{
return $this->skip;
}
public function setSkip($skip)
{
$this->skip = $skip;
}
public function getTake()
{
return $this->take;
}
public function setTake($take)
{
$this->take = $take;
}
public function __construct(array $attributes = array())
{
parent::__construct($attributes);
$this->setTake(8);
$this->setSkip(8);
}
Я задаю здесь свойства skip
и take
.
Затем у меня есть DashboardController
class DashboardController extends Controller
{
private $chat;
/**
* DashboardController constructor.
* @param $chat
*/
public function __construct(Chat $chat)
{
$this->chat = $chat;
}
/**
* Display a listing of the authenticated resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$chats = Chat::orderBy('created_at','desc')->skip($this->chat->getSkip())->take($this->chat->getTake())->get();
$agreements = AgrType::orderBy('created_at','desc')->take(10)->get();
return view('sections.dashboard', compact('chats','agreements'));
}
public function loadMore()
{
$this->chat->setSkip($this->chat->getSkip() - 1 );
$this->chat->setTake($this->chat->getTake() - 1);
return redirect('/dashboard');
}
Мой подход следующий:
После того, как пользователь нажимает кнопку, направьте /loadmore
, чтобы получить его к этому контроллеру и запустить функцию loadMore
.
Затем функция LoadMore
получает значения через аксессоры и устанавливает значения с помощью мутатора.
Затем метод индекса просто считывает эти значения.
Итак, смысл таков: я показываю окно чата (скорее, окно комментариев, потому что это на самом деле не чат), вызывается метод index.
Метод Index считывает значения и отображает комментарии в соответствии с запросом. -> это нормально
Теперь, что НЕ работает:
Когда я нажимаю кнопку, вызывается функция loadMore, которая устанавливает значения, которые затем читает и перезагружает метод индексации в соответствии с ними.
Что я пробовал: я попробовал метод loadMore для отображения собственных значений (измененных) и их возврата, но затем у меня появился новый маршрут для перезагруженного чата, и это не то, что я хочу.
Что я скучаю? Мой подход в порядке? (Я знаю, что javascript, возможно, лучше для этого, но мне нужен способ Laravel, получить и опубликовать.)
Заранее спасибо.
Функции вашего контроллера выполняются в совершенно отдельных запросах.
Все, что return redirect('/dashboard');
делает в loadMore()
, отправляет ваш браузер в маршрут приборной панели. Затем ваш браузер делает новый запрос к index()
, на котором ваш контроллер снова создается, его функция __construct()
запускается снова, и создается новая пустая модель Chat
.
Я рекомендую вам указать параметры take и skip в своем URL-адресе следующим образом:
$router->get('/dashboard/{skip}/{take}', 'DashboardController@index');
И измените свою функцию index()
на это:
public function index($skip, $take)
Таким образом, это будет работать, однако даже лучший способ сделать это - использовать функцию Laravel paginate()
: https://laravel.com/docs/5.6/pagination
public function index()
{
$chats = Chat::orderBy('created_at','desc')->paginate();
$agreements = AgrType::orderBy('created_at','desc')->take(10)->get();
return view('sections.dashboard', compact('chats','agreements'));
}
Я не думаю, что полностью понимаю функцию разбиения на страницы, не могли бы вы отредактировать свой ответ, чтобы помочь мне разбивать результаты на страницы? заранее спасибо
Нет проблем, это должно сработать.
да, разбивка на страницы работает, спасибо, не совсем то, что я хотел, но я понял.
Из вашего кода не очевидно, как он должен работать. Я считаю, что вам следует найти более простой способ реализовать свою идею, чтобы другие разработчики могли легко ее понять.