Лезвие разрыва петли foreach limit laravel

Моя таблица: 'блог'

  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

Как изменить код?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш $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

(Я также немного почистил твой клинок)

Вы можете удалить $i и использовать $loop->index. Это автоматически добавит 1 каждый цикл.

Gert B. 06.04.2022 09:20

@ГертБ. Им не нужен индекс самого цикла, цикл должен прерываться, если внутреннее условие выполняется 5 раз, что может быть после 8, 10 или 100 циклов.

MrEvers 06.04.2022 09:23

Правильно, моя ошибка.

Gert B. 06.04.2022 09:25

Лучше всего сначала задать запрос с вашим условием. сделайте свое приложение/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

поэтому уменьшите код и получите более быстрый вывод.

Другие вопросы по теме