Laravel pagination won't re-initialize MySQL variables











up vote
0
down vote

favorite












If I have this query:



select 
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products


And create a query using Eloquent builder:



Products::from(DB::raw('
(select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products) as q
'))->where('product_rank', '<=', 10)->paginate(5);


Because Laravel pagination wants to get the total count of all records, it executes an extra query like this:



select count(*) as aggregate from (
select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products
) q where product_rank <= 10


So @current_category and @product_rank won't re-initialize and the main query returns wrong results.



I wonder if there is way to re-initialize both variables.










share|improve this question


















  • 1




    See e.g. MySql : Initialize mySql variable inside a query
    – Solarflare
    Nov 10 at 13:27










  • @Solarflare Very nice idea. It works.
    – Omid
    Nov 10 at 14:39















up vote
0
down vote

favorite












If I have this query:



select 
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products


And create a query using Eloquent builder:



Products::from(DB::raw('
(select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products) as q
'))->where('product_rank', '<=', 10)->paginate(5);


Because Laravel pagination wants to get the total count of all records, it executes an extra query like this:



select count(*) as aggregate from (
select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products
) q where product_rank <= 10


So @current_category and @product_rank won't re-initialize and the main query returns wrong results.



I wonder if there is way to re-initialize both variables.










share|improve this question


















  • 1




    See e.g. MySql : Initialize mySql variable inside a query
    – Solarflare
    Nov 10 at 13:27










  • @Solarflare Very nice idea. It works.
    – Omid
    Nov 10 at 14:39













up vote
0
down vote

favorite









up vote
0
down vote

favorite











If I have this query:



select 
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products


And create a query using Eloquent builder:



Products::from(DB::raw('
(select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products) as q
'))->where('product_rank', '<=', 10)->paginate(5);


Because Laravel pagination wants to get the total count of all records, it executes an extra query like this:



select count(*) as aggregate from (
select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products
) q where product_rank <= 10


So @current_category and @product_rank won't re-initialize and the main query returns wrong results.



I wonder if there is way to re-initialize both variables.










share|improve this question













If I have this query:



select 
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products


And create a query using Eloquent builder:



Products::from(DB::raw('
(select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products) as q
'))->where('product_rank', '<=', 10)->paginate(5);


Because Laravel pagination wants to get the total count of all records, it executes an extra query like this:



select count(*) as aggregate from (
select
id,
@product_rank := IF(@current_category = category_id, @product_rank + 1, 1) AS product_rank,
@current_category := category_id
from products
) q where product_rank <= 10


So @current_category and @product_rank won't re-initialize and the main query returns wrong results.



I wonder if there is way to re-initialize both variables.







mysql laravel eloquent






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 10 at 12:07









Omid

1,83353146




1,83353146








  • 1




    See e.g. MySql : Initialize mySql variable inside a query
    – Solarflare
    Nov 10 at 13:27










  • @Solarflare Very nice idea. It works.
    – Omid
    Nov 10 at 14:39














  • 1




    See e.g. MySql : Initialize mySql variable inside a query
    – Solarflare
    Nov 10 at 13:27










  • @Solarflare Very nice idea. It works.
    – Omid
    Nov 10 at 14:39








1




1




See e.g. MySql : Initialize mySql variable inside a query
– Solarflare
Nov 10 at 13:27




See e.g. MySql : Initialize mySql variable inside a query
– Solarflare
Nov 10 at 13:27












@Solarflare Very nice idea. It works.
– Omid
Nov 10 at 14:39




@Solarflare Very nice idea. It works.
– Omid
Nov 10 at 14:39

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238784%2flaravel-pagination-wont-re-initialize-mysql-variables%23new-answer', 'question_page');
}
);

Post as a guest





































active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238784%2flaravel-pagination-wont-re-initialize-mysql-variables%23new-answer', 'question_page');
}
);

Post as a guest




















































































Popular posts from this blog

Coverage of Google Street View

Full-time equivalent

Surfing