This is the endpoint that the AJAX call is hitting:
$reviews = $website->reviews()->where('report_status', '!=', 3)->with('reply', 'reports', 'media', 'user')
->when($request->stars, function($builder, $stars) {
$builder->when(is_array($stars), function($query) use ($stars) {
$query->where(function($query) use ($stars) {
foreach($stars as $star) {
$query->orWhere('review_stars', $star);
}
});
}, function($query) use($stars) {
$query->where('review_stars', $stars);
});
})
->when($request->sort, function($builder, $sort) {
$builder->when($sort == "useful", function($builder) use ($sort) {
$builder->orderBy($sort, 'desc');
}, function($builder) use ($sort) {
$builder->orderBy('created_at', $sort);
});
}, function($builder) {
$builder->orderBy('created_at', 'desc');
})
->when($request->search, function($builder, $search) {
$builder->where(function($query) use ($search) {
$query->orWhereRaw('LOWER(review_header) LIKE LOWER(?)', ["%{$search}%"])
->orWhereRaw('LOWER(review_content) LIKE LOWER(?)', ["%{$search}%"]);
});
})
->paginate(10);
return response()->json([
'pagination' => collect($reviews->toArray())->except('data'),
'html' => view('ajaxViews.reviews', [
'website' => $website,
'reviews' => $reviews
])->render()
]);
That's how I display the HTML returned from the endpoint
function searchUrl(page) {
return '{{ url("/get/" . $website->web_seo_url . "/reviews") }}?' + $("#filterReviewsForm").serialize() + '&page=' + page;
}
function showReviews(page = 1) {
return $.get(searchUrl(page)).done(function (reviews) {
$("#reviews-box").html(reviews.html).ready(function () {
...........
});
});
}
And that's how my json-ld should look like:
<script type="application/ld+json">
{
"@context" : "https://schema.org/",
// .........
@if($website->reviews)
@foreach($website->reviews()) // which is a duplicate of the query that is getting the reviews for the website and its slowing so much the page because there are many reviews
// ....... some json-ld content
@endforeach
@endif
}
</script>
How to prevent duplicating this big query?