Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Здравствуйте.
Получаю данные из модели:
$companies = Company::select('*')->paginate(20);
Вывожу их во view:
<table class="table table-hover">
<thead>
<tr>
<th>№</th>
<th>Название</th>
<th>Город</th>
<th>Email</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach($companies as $company)
<?php //dd($company);?>
<tr>
<td>{{ $company->id }}</td>
<td>{{ $company->name }}</td>
<td><a href=""><i class="fa fa-filter" )></i></a> {{ $company->city->name }}</td>
<td>{{ $company->email }}</td>
<td>
<a href="#" class="btn btn-default" title="Редактировать"><i class="fa fa-edit"></i></a>
<a href="#" class="btn btn-danger" title="Удалить"><i class="fa fa-trash"></i></a>
</td>
</tr>
@endforeach
</tbody>
</table>
{{ $companies->render() }}
Но при переходи по страницам всегда открыта первая страница. В чем может быть проблема?
Не в сети
Вы не знаете SQL и не знаете Eloquent/
Так нельзя
::select('*')
Либо делайте
::where(1,'='1)
либо ничего не указывайте.
Это во первых.
Во вторых либо используйите встроенный пагинатор
{{ $companies->links() }}
Который описан В ДОКУМЕНТАЦИИ: https://laravel.ru/docs/v5/pagination
либо к своим ссылкам добавляйте ?page=X, где Х = номер страницы, который можно понять из вычислений, компоненты которых есть в объекте $companies
Не в сети
Во вторых либо используйите встроенный пагинатор
{{ $companies->links() }}
Он уже использует его:
{{ $companies->render() }}
links() - это синоним render() и он не делает ничего, кроме того, что вызывает render():
public function links($view = null)
{
return $this->render($view);
}
Не в сети
Он уже использует его:
{{ $companies->render() }}
Прошу простить дилетантский вопрос, а в 5.3 это работает?
Не в сети
Прошу простить дилетантский вопрос, а в 5.3 это работает?
Да. Более того, links() метод deprecated еще с 5.0 и рекомендуется использовать render(). Это означает, что в одной из версий links() уберут, как убрали ::controller, например. Посмотри исходный код и все станет ясно. Если в двух словах, то весь функционал живет в render(), а links() только вызывает render().
Изменено AlexeyMezenin (08.11.2016 12:37:52)
Не в сети
Понял, спасибо, буду знать.
Не в сети
Вы не знаете SQL и не знаете Eloquent/
Так нельзя::select('*')
Либо делайте
::where(1,'='1)
либо ничего не указывайте.
Это во первых.
эта конструкция работает, возвращает все поля и так принято в SQL (SELECT * FROM ...)
Я поменял на $companies = Company::paginate(5); но все равно возвращает только первую страницу на пагинацию не обращает внимания
Не в сети
$companies = Company::paginate(20);
Так на первой странице пять компаний, так? А в пагинаторе сколько страниц? Сами ссылки в пагинаторе присутствуют, только не работают, или их вообще нет?
Не в сети
Так на первой странице пять компаний, так? А в пагинаторе сколько страниц? Сами ссылки в пагинаторе присутствуют, только не работают, или их вообще нет?
Всего в БД около 100 компаний, в пагинации настроена 20 и на странице выводится 20 (5 - это я опечатался), в пагинации есть ссылки на все 5 страниц, при переходе по пагинации в в url добавляется ?page=4 , но страница всегда остается открытая первая
Не в сети
А не пробовали повторить в точности, как в документации, и без разметки? Работает?
Не в сети
А не пробовали повторить в точности, как в документации, и без разметки? Работает?
у меня и сделано как в документации
$companies = Company::paginate(20);
Но разметку не убирал, не вижу смысла, как разметка может повлиять?
Не в сети
И я не вижу, если честно. Просто такой у меня способ, свести все к эталону, если не пойми что происходит. Мало ли :-)
Не в сети
ссылки вида link?page=1 , link?page=2 работают?
Не в сети
ссылки вида link?page=1 , link?page=2 работают?
Да, по ним переходишь нормально, но контент всегда выводится c ?page=1
Не в сети
Да. Более того, links() метод deprecated еще с 5.0 и рекомендуется использовать render(). Это означает, что в одной из версий links() уберут, как убрали ::controller, например. Посмотри исходный код и все станет ясно. Если в двух словах, то весь функционал живет в render(), а links() только вызывает render().
А где посмотреть, что метод deprecated?
Просто непонятно тогда, почему в документации примеры до сих пор с {{ $users->links() }}
Вопрос больше риторический конечно.
Не в сети
hzone пишет:ссылки вида link?page=1 , link?page=2 работают?
Да, по ним переходишь нормально, но контент всегда выводится c ?page=1
ПОКАжИ ПОЛНОСТЬю МОДЕЛЬ КОМПАНИЙ
и почему до сих пор никто не спросил? умники
Не в сети
Fubu_By пишет:hzone пишет:и почему до сих пор никто не спросил? умники
потому что умники читаю. Написанно же с самого начало.
Но при переходи по страницам всегда открыта первая страница. В чем может быть проблема?
и далее
Всего в БД около 100 компаний, в пагинации настроена 20 и на странице выводится 20 (5 - это я опечатался), в пагинации есть ссылки на все 5 страниц, при переходе по пагинации в в url добавляется ?page=4 , но страница всегда остается открытая первая
проверь так
$currentPage = Request::input('page');
// force current page to 5
Paginator::currentPageResolver(function() use ($currentPage) {
return $currentPage;
});
$companies = Company::paginate(20);
А где посмотреть, что метод deprecated?
Просто непонятно тогда, почему в документации примеры до сих пор с {{ $users->links() }}
Вопрос больше риторический конечно.
https://laravel.com/docs/5.3/upgrade#upgrade-5.0
Replace any calls to $paginator->links() with $paginator->render()
Не в сети
ПОКАжИ ПОЛНОСТЬю МОДЕЛЬ КОМПАНИЙ
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use SleepingOwl\Admin\Traits\OrderableModel;
class Company extends Model
{
use SoftDeletes;
use OrderableModel;
protected $table = 'companies';
public function city()
{
return $this->belongsTo(City::class);
}
public function cuisine()
{
return $this->belongsTo(Cuisine::class);
}
public function products()
{
return $this->hasMany(Product::class, 'company_id');
}
public function transactions()
{
return $this->hasMany(Transaction::class, 'company_id');
}
public function companyReviews()
{
return $this->hasMany(CompanyReview::class, 'company_id');
}
public function productscsv()
{
return $this->hasMany(ProductCsv::class, 'company_id', 'id');
}
public function scopeCity($query, $cityID)
{
return $query->where('city_id', $cityID);
}
public function scopePublished($query)
{
return $query->where('status', 1);
}
public function getOrderField()
{
return 'order';
}
public function setPaymentTypeAttribute($value)
{
$this->attributes['payment_type'] = empty($value) ? '' : implode(',', $value);
}
public function getPaymentTypeAttribute($value)
{
return explode(',', $value);
}
public function getLink()
{
return 'ресторан/' . $this->url;
}
public function getCategories()
{
$categoriesID = $this->products()->pluck('category_id')->unique()->toArray();
return Category::whereIn('id', $categoriesID)->get();
}
public function getCuisines()
{
$cuisinesID = $this->products()->pluck('cuisine_id')->unique()->toArray();
return Cuisine::whereIn('id', $cuisinesID)->get();
}
public static function boot()
{
static::creating(function($instance)
{
$pattern = '#[^-а-яА-Яa-zA-Z0-9_ ]/u#';
$name = preg_replace($pattern, ' ', $instance->name);
$name = mb_strtolower(trim($name));
$pattern = '#[-_ ]+#';
$name = preg_replace($pattern, '-', $name);
$instance->url = $name;
});
parent::boot();
}
}
Изменено Fubu_By (11.11.2016 10:20:46)
Не в сети
hzone пишет:ссылки вида link?page=1 , link?page=2 работают?
Да, по ним переходишь нормально, но контент всегда выводится c ?page=1
Попробуй когда рендеришь appends
$paginator->appends(['value']=> $request)->render()
подробнее тут
http://laravel.su/docs/5.0/pagination#a … tion-links
Убери boot() и посмотри без него (догадка). И если я правильно понял действия в буте, то для управления аттрибутами стоит пользоваться методами setNAMEAttribute / getNAMEAttribute
для примера App\User.php:
/**
* @param $password
*/
public function setPasswordAttribute( $password )
{
$this->attributes[ 'password' ] = Hash::make( $password );
}
Не в сети
странно получается, когда пытаюсь получить текущую страниц:
$currentPage = $companies->currentPage();
то всегда возвращает первую
Не в сети
Paginator::resolveCurrentPage()
тоже всегда возвращает первую страницу. Получается что проблема в самом Paginator
Не в сети