Laravel – Union + Paginate в то же время?

Я пытаюсь объединить 2 таблицы (рецепты + сообщения) и добавить -> paginate (5) к запросам.

Но по какой-то причине я получаю эту ошибку:

Нарушение кардинальности: 1222 Используемые операторы SELECT имеют различное количество столбцов (SQL: (выберите count (*) как совокупность из posts

Мой код:

 $recipes = DB::table("recipes")->select("id", "title", "user_id", "description", "created_at") ->where("user_id", "=", $id); $items = DB::table("posts")->select("id", "title", "user_id", "content", "created_at") ->where("user_id", "=", $id) ->union($recipes) ->paginate(5)->get(); 

Я делаю что-то неправильно?

  • Без -> paginate (5) запрос работает нормально.

Вы правы, проблема с разбивкой на страницы вызывает проблемы. Прямо сейчас вы можете создать представление и запросить представление вместо фактических таблиц или создать свой Paginator вручную:

 $page = Input::get('page', 1); $paginate = 5; $recipes = DB::table("recipes")->select("id", "title", "user_id", "description", "created_at") ->where("user_id", "=", $id); $items = DB::table("posts")->select("id", "title", "user_id", "content", "created_at") ->where("user_id", "=", $id) ->union($recipes) ->get(); $slice = array_slice($items, $paginate * ($page - 1), $paginate); $result = Paginator::make($slice, count($items), $paginate); return View::make('yourView',compact('result')); 

Сортировать по

  $page = Input::get('page', 1); $paginate = 5; $recipes = DB::table("recipes")->select("id", "title", "user_id", "description", "created_at") ->where("user_id", "=", $id); $items = DB::table("posts")->select("id", "title", "user_id", "content", "created_at") ->where("user_id", "=", $id) ->union($recipes) ->orderBy('created_at','desc') ->get(); $slice = array_slice($items, $paginate * ($page - 1), $paginate); $result = Paginator::make($slice, count($items), $paginate); return View::make('yourView',compact('result'))->with( 'result', $result ); по  $page = Input::get('page', 1); $paginate = 5; $recipes = DB::table("recipes")->select("id", "title", "user_id", "description", "created_at") ->where("user_id", "=", $id); $items = DB::table("posts")->select("id", "title", "user_id", "content", "created_at") ->where("user_id", "=", $id) ->union($recipes) ->orderBy('created_at','desc') ->get(); $slice = array_slice($items, $paginate * ($page - 1), $paginate); $result = Paginator::make($slice, count($items), $paginate); return View::make('yourView',compact('result'))->with( 'result', $result ); 

Просмотр страницы :

  @foreach($result as $data) {{ $data->your_column_name;}} @endforeach {{$result->links();}} //for pagination 

его помощь большему количеству людей .. потому что никто не может понять, что данные показывают в виде соединения страниц с разбиением на страницы и упорядочением .. thank u

Я уже столкнулся с такой проблемой. Я нашел поток также не о pagination а о unions .

См. Эту ссылку: Сортировка запросов UNION с помощью Laravel 4.1

@Mohamed Azher поделился приятным трюком, и он работает над моей проблемой.

 $query = $query1->union($query2); $querySql = $query->toSql(); $query = DB::table(DB::raw("($querySql order by foo desc) as a"))->mergeBindings($query); 

Это создает sql, как показано ниже:

 select * from ( (select a as foo from foo) union (select b as foo from bar) ) as a order by foo desc; 

И вы уже можете использовать Paginate Laravel так же, как обычно, как $query->paginate(5) . (но вы должны раскошелиться, чтобы соответствовать вашей проблеме)

У меня была такая же проблема, и, к сожалению, я не смог получить ссылки на страницы с {{ $result->links() }} , но я нашел другой способ записать фрагментацию страницы и ссылки на страницу

Индивидуальная разбивка на страницы с помощью Laravel 5

 //Create a new Laravel collection from the array data $collection = new Collection($searchResults); //Define how many items we want to be visible in each page $perPage = 5; //Slice the collection to get the items to display in current page $currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all(); //Create our paginator and pass it to the view $paginatedSearchResults= new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage); return view('search', ['results' => $paginatedSearchResults]); 
 $page = Input::get('page', 1); $paginate = 5; $recipes = DB::table("recipes")->select("id", "title", "user_id", "description", "created_at") ->where("user_id", "=", $id); $items = DB::table("posts")->select("id", "title", "user_id", "content", "created_at") ->where("user_id", "=", $id)->union($recipes)->get()->toArray(); $slice = array_slice($items, $paginate * ($page - 1), $paginate); $result = new Paginator($slice , $paginate);