文章目录 [+]
Laravel有这么一个功能,with渴望式加载数据,这里不多介绍with功能,百度一大堆,但是with有一个比较坑的地方就是无法限定条数,例子如下:
Post表结构如下:
字段 | 注释 |
id | id、自增 |
title | 标题 |
content | 内容 |
Comment表结构如下:
字段 | 注释 |
id | id、自增 |
post_id | 文章表id |
user_id | 用户id |
content | 评论内容 |
那么我们将会生成两个模型:如下
Post模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class PostModel extends Model { protected $table = 'post'; /** * 生成一对多关联 */ public function comment () { return $this->hasMany ( 'App\Models\CommentModel' ,'post_id' ); } }
Comment模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class CommonModel extends Model { protected $table = 'comment'; }
那么我们获取所有文章,且每条文章最多显示显示评论条数3条(一对多,全部输出,数据量太大了)
撸代码拉:
一般人获取文章列表以及文章评论是这样写的:
$result = PostModel::select('id','title','content')->paginate ( 10 ); foreach ( $result as $k => $v ) { $result[ $k ][ 'comment' ][] = CommentModel::where ( "post_id" , $v->id ) ->limit ( 3 ) ->get (); }
用Laravel with的方式如下:
$result = PostModel::select('id','title','content') ->with(['comment' => function ( $query ) { $query->select ( 'id' , 'user_id' , 'content' ); }]) ->paginate ( 10 );
如上,我们一步一步来,我们将会获取评论的id、用户id(可以自己后边加join用户表)、和评论内容,那么我们会发现一个问题,返回的comment数组为空,尽管他执行了select * from comment where post_id in (1,2,3....) ,这是为什么呢?是因为你要将外键也给select出来,在select 中加入post_id。
然后你想limit,你再后边加了limit或者是task,会发现没有任何作用,那么安装我下边的操作就没问题啦:
$result = PostModel::select('id','title','content') ->with(['comment' => function ( $query ) { $query->select ( 'id' ,'post_id', 'user_id' , 'content' ); }]) ->map(function ($item) { // 可以试下重新设置关系: $item->setRelation('comment', $item->comment->take(3)); return $item; }) ->paginate ( 10 );
这样就可以了哦,做到了每条文章最多显示3篇评论;
如果有啥问题最直接@我哦!
发表评论