#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)
и опубликуйте здесь для лучшего понимания.