PHP считает 3 переменных и удаляет 3

#php #laravel #count

#php #laravel #подсчитайте

Вопрос:

я надеюсь, что название уже объясняет, что я здесь ищу. Я использую laravel, и мне трудно вернуть только 3 объекта.

Я получаю объект, который содержит несколько сообщений. Я хочу вывести только 3 из этих объектов, а остальные оставить.

Я использую это автоматически, но это не работает, поскольку я не получаю массив.

     @if(count($posts) >= '3')
        <?php array_splice($posts, 3); ?>
    @endif
  

Я знаю, что в Laravel встроена функция разбиения на страницы, но иногда это возвращает только 2 или 1 или 4, никогда не нужное количество.

print_r $posts

 IlluminateDatabaseEloquentCollection Object ( [items:protected] => Array ( [0] => DigitusBaseModelPost Object ( [fillable:protected] => Array ( [0] => title [1] => body [2] => author [3] => slug [4] => image [5] => metatitle [6] => metadescription [7] => robots [8] => ogtitle [9] => ogdescription [10] => ogsitename [11] => ogurl [12] => ogimage [13] => ogtype [14] => concept ) [connection:protected] => [table:protected] => [primaryKey:protected] => id [perPage:protected] => 15 [incrementing] => 1 [timestamps] => 1 [attributes:protected] => Array ( [id] => 15 [concept] => 0 [title] => Hoe Je Kunt Zien Wanneer Je Fans Online Zijn En Hoe Je Hier Eenvoudig Op Inspeelt Om Zo Veel Mogelijk Fans Te Bereiken. [body] => 
  

Комментарии:

1. Если $posts это не массив, что это такое?

2. это объект, в нем находится массив, содержащий все записи. Итак, я должен передать объект..

Ответ №1:

Вы все опережаете себя, если вам нужно только 3, не берите их все, а затем отображайте только 3, просто возьмите 3.

 Posts::where('blargh', 'honk')->take(3);
  

Я предполагаю, что вы используете get() метод в своей модели для возврата коллекции, вместо этого замените take() его методом, который добавит a limit к запросу. Очевидно, вам нужно будет добавить свой порядок и т. Д., Но это правильный способ сделать это в конце запроса, а не в конце просмотра.

Комментарии:

1. Хорошо, большое спасибо, я проверю это через минуту. PS. могу ли я также сделать это при получении сообщений из категории? с отношением «многие ко многим»

2. Ну, используя следующее: $cats= Categorie::where(‘name’,’=’,$categorie->name)->first(); $posts = $cats->posts()-> take(3); Не работает. Есть ли другой подход к этому или .. ?

Ответ №2:

Документы по объекту коллекции, который у вас есть, показывают, что существует метод slice, поэтому это должно сработать:

     @if(count($posts) >= '3')
        <?php $posts->slice(3); ?>
    @endif
  

Ответ №3:

Вот грязное решение:

 <?php $i = 0;?>
@foreach($posts as $post)
    <?php $i  ; if($i==4) break;?>
    {{ $post->title }}
@endif
  

Комментарии:

1. @Jeroen вы должны проверить ответ Джима — он более корректен для фреймворка и гораздо менее грязный.

2. Это ужасно, с какой стати вы это делаете?

3. Я согласен с вами, ребята, ответ Джима чист, я просто сделал быстрое решение. Полезно знать, что есть метод slice

Ответ №4:

Если вам нужно захватить только первые или последние 3, take должно сработать.

 @foreach($posts->take(3) as $post)
    {{ $post->title }}
@endforeach
  

Но если вам нужно только 3 из чего-то с самого начала, вы бы хотели ограничить это в источнике, как упоминал ollieread.

Ссылка: Support Collection@take

public function take($limit = null) «Возьмите первые или последние элементы {$limit}».

Ответ №5:

Попробуйте это-> Вы используете неправильный синтаксис.

 if(count($posts) >= 3):
        <?php array_splice($posts, 3); ?>
    endif;
  

Комментарии:

1. Он использует движок шаблонов laravels. я думаю, потому что у него есть laravel в качестве тега.

2. Спасибо за быстрый ответ, но это то же самое 🙂 я ищу альтернативу для array_splice, так как я получаю объект, возвращаемый со всеми сообщениями в нем.

3. print_r($posts) и опубликуйте здесь для лучшего понимания.