Моя таблица: 'блог'
id | cat | title
---------------------------
1 | 3,4 | Post 01 X
2 | 1,2 | Post 02
3 | 4,2 | Post 03 X
4 | 3,2 | Post 04
5 | 1,1 | Post 05
6 | 3,1 | Post 06
7 | 3,2 | Post 07
8 | 3,4 | Post 08 X
9 | 1,4 | Post 09 X
10 | 2,4 | Post 10 X
11 | 4,6 | Post 11 X
12 | 4,7 | Post 12 X
13 | 4,1 | Post 13 X
14 | 7,4 | Post 14 X
15 | 4,2 | Post 15 X
Мой маршрут: маршруты/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Frontend\CategoryController
Route::get('/cat',[CategoryController::class,'CAT']);
Мой контроллер: приложение/Http/Контроллеры/Внешний интерфейс/CategoryController.php
<?php
namespace App\Http\Controllers\Frontend;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
class CategoryController extends Controller
{
public function CAT(){
$cats = DB::table('blog')->orderBy('id','DESC')->get();
$cat_select = '4';
$data = array( 'cats' => $cats, 'cat_select' => $cat_select, );
return view('frontend.category', $data );
}
}
Мой клинок: ресурсы/представления/интерфейс/category.blade.php
@foreach($cats->take(5) as $row)
@php
$data = $row->cat;
$sep_cat = explode(',' , $data);
@endphp
@foreach ($sep_cat as $cat)
@if ( $cat == $cat_select )
{{$row->id}} | {{$row->title}}
@endif
@endforeach
@endforeach
Выход:
1 | Post 01
3 | Post 03
Но я хочу отобразить вывод следующим образом: ( $cat_select = '4' и лимит: 5 )
1 | Post 01
3 | Post 03
8 | Post 08
9 | Post 09
10 | Post 10
Я проверил эту ссылку ниже, но она не отображается правильно: Ограничение результатов в цикле Blade foreach
Как изменить код?






Ваш $cats->take(5) берет первые 5 результатов (таким образом, идентификаторы от 1 до 5, 8, 9, а затем не являются частью этого выбора). Вы можете использовать счетчик, который вы обновляете с каждым сообщением, а затем прерывать после 5:
@php $i = 0; @endphp
@foreach($cats as $row)
@if (in_array($cat_select, explode(',' , $row->cat)))
{{$row->id}} | {{$row->title}}
@php $i++; @endphp
@if ($i == 5) @break @endif
@endif
@endforeach
(Я также немного почистил твой клинок)
@ГертБ. Им не нужен индекс самого цикла, цикл должен прерываться, если внутреннее условие выполняется 5 раз, что может быть после 8, 10 или 100 циклов.
Правильно, моя ошибка.
Лучше всего сначала задать запрос с вашим условием. сделайте свое приложение/Http/Controllers/Frontend/CategoryController.php:
<?php
namespace App\Http\Controllers\Frontend;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
class CategoryController extends Controller
{
public function CAT(){
$cat_select = '4';
$cats = DB::table('blog')->where('cat', 'like', "$cat_select,%")
->orWhere('cat', 'like', "%,$cat_select")
->orWhere('cat', 'like', "%,$cat_select,%")
->orderBy('id','DESC')->get();
$data = array( 'cats' => $cats, 'cat_select' => $cat_select, );
return view('frontend.category', $data );
}
}
Но я рекомендую вам использовать json в таблице:
id | cat | title
---------------------------
1 | [3,4] | Post 01 X
2 | [1,2] | Post 02
3 | [4,2] | Post 03 X
поэтому ваш запрос изменится на это:
$cats = DB::table('blog')->whereJsonContains('cat', $cat_select)
->orderBy('id','DESC')->get();
и resources/views/frontend/category.blade.php будет:
@foreach($cats as $row)
{{$row->id}} | {{$row->title}}
@endforeach
Вместо foreach loop используйте запрос laravel, чтобы получить 5 записей с cat_select = 4, используя запрос whereRaw
$cats = DB::table('blog')->whereRaw("find_in_set('4',cat)")->limit(5)->get();
@foreach($cats as $row)
{{$row->id}} | {{$row->title}}
@endforeach
поэтому уменьшите код и получите более быстрый вывод.
Вы можете удалить
$iи использовать$loop->index. Это автоматически добавит 1 каждый цикл.