Php Mysql查询组Concat在单个查询中限制子表的多条记录 相册表: 相册成员表: 相册\u媒体表: 我的问题是:

Php Mysql查询组Concat在单个查询中限制子表的多条记录 相册表: 相册成员表: 相册\u媒体表: 我的问题是:,php,mysql,laravel,eloquent,laravel-5.1,Php,Mysql,Laravel,Eloquent,Laravel 5.1,现在,对于每个相册,都有多个相册媒体和相册成员,相册用户正在为其跟踪我希望以这样的方式检索所有使用该相册的相册和该相册的所有照片,但约束是需要设置相册媒体限制5和相册限制30。 limit不起作用,因为我使用了group\u concat的任何其他方式来限制group\u concat的记录 我使用的是laravel,因此任何与此相关的解决方案都是最受欢迎的 我使用了substring\u index()函数,但从性能角度来看,这是否足够? 我和拉威尔试过这个问题 Laravel查询(编辑):

现在,对于每个相册,都有多个相册媒体和相册成员,相册用户正在为其跟踪我希望以这样的方式检索所有使用该相册的相册和该相册的所有照片,但约束是需要设置相册媒体限制5和相册限制30。

  • limit
    不起作用,因为我使用了group\u concat的任何其他方式来限制group\u concat的记录

  • 我使用的是laravel,因此任何与此相关的解决方案都是最受欢迎的

  • 我使用了substring\u index()函数,但从性能角度来看,这是否足够?

    我和拉威尔试过这个问题

    Laravel查询(编辑):
    建立关系,然后像这样约束它们:

    $albums = Album::with('albumMedia', 'albumMembers')
    ->whereHas('albumMembers', function($query) use ($userId) {
        $query->where('albumMembers.member_id', $userId);
    })
    ->orderBy('album.updated_at')
    ->take($limit)
    ->skip($skip)
    ->get();
    
    最后,您可以在相册模型中添加一个方法,该方法将帮助您根据急切加载的关系检索连接的字符串/链接


    更好的是,您可以在相册模型上使用类似scope的方法来为您创建它,而不是使用whereHas。这比上面的例子要干净得多。

    我想知道你是否试过。然而,这种雄辩的方法将有一个嵌套结构。@Tezla,我已经尝试过了,但我有动态id,所以它不起作用,看看它…
    data['album']=album::select(“album.*”->leftjoin(“album_media”,“album_media.album_id”,“album_.id”)->leftjoin(“album_member”,“album_member.album_id”,“album.=”,“album.id”)->在哪里('album_member.member_id',$member_id)->with(['albumMedia'=>函数($query){return$query->where('album_id','album.id')->take(5);}])->groupBy('album.id')->orderBy('album.updated_at','desc take($limit take)->skip($skip)->get()->toArray()
    laravel raw查询是我无法理解的,如果你想检索任何与之相关的相册(相册媒体和相册成员)。可以通过
    album::where('id',$id)->使用(['albumMedia'=>函数($query){return$query->take(5);},'albumMember'=>函数($query use($member\id){return$query->where('member\id',$member\id')->取(30);}])->first()
    假设您在模型之间有适当的关系..ps.我认为您需要将
    $member\u id
    传递给渴望约束。感谢@Tezla的回复,但相册id不是静态的。相册id是由
    相册成员
    返回的,因此它存储在相册媒体中,具有适当的
    $member\u id
    我只有
    成员id
    非常感谢您的顺应性这可能有助于限制团队成员的发言
    +------------------------------------+
    | id      album_id         member_id |
    +------------------------------------+
    
    +--------------------------------+
    | id       album_id         link |
    +--------------------------------+
    
    $limit = 30;
    $member_id = 1;
    SELECT a . *,
    (SELECT GROUP_CONCAT(CONCAT('$assets/album_image/medium/', ds_album_media.link) SEPARATOR ',') as link
    FROM ds_album_media WHERE ds_album_media.album_id = a.id ORDER BY a.updated_at desc LIMIT 0 , 5)
    AS photo_link FROM `ds_album` a
    LEFT JOIN ds_album_media amd ON amd.album_id = a.id
    LEFT JOIN ds_album_member amb ON amb.album_id = a.id
    where amb.member_id = " . $member_id . " GROUP BY a.id
    ORDER BY a.updated_at desc LIMIT 0 , $limit
    
    $data = Album::select("album.*")
        ->leftjoin("album_media", 'album_media.album_id', '=', 'album.id')
                        ->leftjoin("album_member", 'album_member.album_id', '=', 'album.id')
        ->where('album_member.member_id', $member_id)
        ->with(['albumMedia' => function($query) {
           return $query->where('album_id','album.id')->take(5);
        }])
        ->groupBy('album.id')->orderBy('album.updated_at', 'desc')->take($limit)->skip($skip)->get()->toArray();
    
    $albums = Album::with('albumMedia', 'albumMembers')
    ->whereHas('albumMembers', function($query) use ($userId) {
        $query->where('albumMembers.member_id', $userId);
    })
    ->orderBy('album.updated_at')
    ->take($limit)
    ->skip($skip)
    ->get();