我正在使用Laravel中的一个项目并使用DB facade来运行sql的原始查询。 在我的情况下,我使用DB :: select,问题是分页方法不能使用此DB原始查询并显示此错误
Call to a member function paginate() on array
我只想知道如何使用DB原始查询实现laravel分页 这是我的代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Notice;
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;
class NoticeController extends Controller
{
public function index(){
$notices = DB::select('select
notices.id,notices.title,notices.body,notices.created_at,notices.updated_at,
users.name,departments.department_name
FROM notices
INNER JOIN users ON notices.user_id = users.id
INNER JOIN departments on users.dpt_id = departments.id
ORDER BY users.id DESC')->paginate(20);
$result = new Paginator($notices,2,1,[]);
return view('welcome')->with('allNotices', $notices);
}
}
答案 0 :(得分:13)
public function index(Request $request){
$notices = DB::select('select notices.id,notices.title,notices.body,notices.created_at,notices.updated_at,
users.name,departments.department_name
FROM notices
INNER JOIN users ON notices.user_id = users.id
INNER JOIN departments on users.dpt_id = departments.id
ORDER BY users.id DESC');
$notices = $this->arrayPaginator($notices, $request);
return view('welcome')->with('allNotices', $notices);
}
public function arrayPaginator($array, $request)
{
$page = Input::get('page', 1);
$perPage = 10;
$offset = ($page * $perPage) - $perPage;
return new LengthAwarePaginator(array_slice($array, $offset, $perPage, true), count($array), $perPage, $page,
['path' => $request->url(), 'query' => $request->query()]);
}
答案 1 :(得分:6)
尝试:
$notices = DB::table('notices')
->join('users', 'notices.user_id', '=', 'users.id')
->join('departments', 'users.dpt_id', '=', 'departments.id')
->select('notices.id', 'notices.title', 'notices.body', 'notices.created_at', 'notices.updated_at', 'users.name', 'departments.department_name')
->paginate(20);
答案 2 :(得分:2)
永远不要在php端使用分页逻辑! 在您的sql上使用limit和offset,其余的留给数据库服务器。 额外为您的语句使用单独的count-select。
计数:
$sql_count = 'SELECT count(1) cnt FROM ('. $sql . ') x';
$result = \DB::select( DB::raw($sql_count) );
$data['count'] = $result[0]->cnt;
结果:
$sql .= ' LIMIT ' . $offset . ', ' . $limit;
$result = \DB::select( DB::raw($sql) );
$myPaginator = new \Illuminate\Pagination\LengthAwarePaginator($result, $data['count'], $limit, $page, ['path' => action('MyController@index')]);
$data['result'] = $result;
答案 3 :(得分:1)
它对我有用,看 首次在您的控制器中使用
use Illuminate\Pagination\Paginator;
然后在函数中
$query = DB::select(DB::raw("SELECT pro.* , (SELECT TIMESTAMPDIFF(DAY,updated_at,'$current_date') from users as u where u.id=pro.id) as days FROM users as pro where role_id = 6 and delete_status=0 and user_status = 'A' and approved_status = 1 and is_clever_courier = 1 having days >= 5"));
$page1 = new Paginator($all_list, $maxPage);
dd($page1)
o/p =>
Paginator {#1450 ▼
#hasMore: true
#items: Collection {#1509 ▼
#items: array:10 [▼
0 => {#1454 ▶}
1 => {#1455 ▶}
2 => {#1456 ▶}
3 => {#1457 ▶}
4 => {#1458 ▶}
5 => {#1459 ▶}
6 => {#1460 ▶}
7 => {#1461 ▶}
8 => {#1462 ▶}
9 => {#1463 ▶}
]
}
#perPage: 10
#currentPage: 1
#path: "/"
#query: []
#fragment: null
#pageName: "page"
+onEachSide: 3
#options: []
答案 4 :(得分:0)
这很适合我
$sql = "some sql code";
$page = 1;
$size = 10;
$data = DB::select($sql);
$collect = collect($data);
$paginationData = new LengthAwarePaginator(
$collect->forPage($page, $size),
$collect->count(),
$size,
$page
);
答案 5 :(得分:0)
在尝试了很多事情之后,我找到了这个解决方案,它对我来说很好用,也许对某人有帮助。 首先,在 PHP 类中包含一个类 use Illuminate\Pagination\LengthAwarePaginator; 公共函数索引(请求 $request){
$notices = DB::select('select notices.id,notices.title,notices.body,notices.created_at,notices.updated_at,
users.name,departments.department_name
FROM notices
INNER JOIN users ON notices.user_id = users.id
INNER JOIN departments on users.dpt_id = departments.id
ORDER BY users.id DESC');
$notices = $this->arrayPaginator($notices, $request);
return view('welcome')->with('allNotices', $notices);
}
public function arrayPaginator($array, $request)
{
$page = Input::get('page', 1);
$perPage = 10;
$offset = ($page * $perPage) - $perPage;
return new LengthAwarePaginator(array_slice($array, $offset, $perPage, true), count($array), $perPage, $page,
['path' => $request->url(), 'query' => $request->query()]);
}