Laravel 9中如何筛选posts表非空video列数据并分页?
问题解决方法
你的核心问题是查询条件逻辑错误,where('video', '>', 0)只适用于数值类型字段,但video列应该是存储路径/URL的字符串类型——字符串和数字0比较会被强制转成数字(空字符串或非数字开头的字符串都会转为0),所以这个条件筛选不到任何数据。
正确的查询写法
根据video列的实际存储情况,选择以下方式:
- 兼容全Laravel版本的基础写法:筛选
video不为null且不是空字符串的记录
// 控制器中的查询代码 $posts = Post::whereNotNull('video') ->where('video', '<>', '') ->inRandomOrder() ->paginate(3);
- Laravel 9+简化写法:直接用
whereNotEmpty方法,等价于上面的两个条件
$posts = Post::whereNotEmpty('video') ->inRandomOrder() ->paginate(3);
为什么之前的写法不符合需求
Post::inRandomOrder()->simplePaginate(1)没有添加任何筛选条件,所以会返回所有帖子,只是每页显示1条并随机排序,自然不符合你的需求。
视图代码保持正常渲染即可
比如在Blade视图中循环展示帖子和分页:
@foreach($posts as $post) <div class="post-item"> @if($post->video) <video src="{{ $post->video }}" controls></video> @endif <!-- 其他帖子内容,比如标题、描述等 --> </div> @endforeach <!-- 渲染分页链接 --> {{ $posts->links() }}
内容的提问来源于stack exchange,提问作者Davi
相关产品推荐
相关产品推荐

