一个菜鸟驿站!

Laravel with 限定条数

PHP 2019-10-30 浏览(3000) 评论(0)
- N +

文章目录 [+]

Laravel有这么一个功能,with渴望式加载数据,这里不多介绍with功能,百度一大堆,但是with有一个比较坑的地方就是无法限定条数,例子如下:

Post表结构如下:

字段注释
idid、自增
title标题
content
内容

Comment表结构如下:

字段注释
idid、自增
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篇评论;

如果有啥问题最直接@我哦!



标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔