请问一下这个查询该如何写

需求

动态表(feeds),如下字段

  • id,
  • user_id,作者
  • view_permission-该动态的查看权限allUser-所有人可见,creatorOnly-自己可见,memberOnly圈子成员可见

圈子表(topics),如下字段

  • id
  • name

动态-圈子关联表(feed_topics)

  • id
  • feed_id
  • topic_id

用户-圈子表(user_topics),也就是用户加入的圈子

  • id
  • user_id
  • topic_id

现在的需求是,我获取动态列表时,要根据每条动态的查看权限来展示,当查看权限是仅自己可见所有人可见,都很好处理,就是圈子成员可见不知道怎么处理

$builder->WhereRaw('IF(`feeds`.`view_permission`=creatorOnly, feeds.user_id='.$user->id.', todo)')

这个是我大致的一个思路,但是感觉有问题,各位有没有好的想法?

心之所向,素履以往。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案
$query = Model();
$query->where(function ($query) {
    $query->orWhere(function ($query) {
       $query->where('role', 1);
    });
    $query->orWhere(function ($query) {
       $query->where('role', 2);
       $query->where('user_id', $user_id);
    });
    $query->orWhere(function ($query) {
       $query->where('role', 3);
       $query->whereHas('quanzi', function($query){
           $query->whereIn('user_id', $user_id);
       });
    });
});
3年前 评论
Adachi 3年前
讨论数量: 7

首先查当前登录用户所属的圈子,再查设置了memberOnly且和登录用户所属圈子关联的动态就是圈子成员可见的结果

3年前 评论
lmdfx (楼主) 3年前
zhangrongwang (作者) 3年前

先查出登录用户的圈子,逗号分隔成如 1,2,3

SELECT a.*
FROM feeds AS a
LEFT JOIN feed_topics AS b ON b.feed_id = a.id AND FIND_IN_SET(b.topic_id, '1,2,3')
WHERE a.view_permission IN ('allUser', 'creatorOnly') OR (a.view_permission = 'memberOnly' AND b.id IS NOT NULL)

我没测试,也没按ORM写,你可以先试一下,应该没问题,实际上也是应该先完成这个SQL再写成ORM

另外laravelORM其实自带这些功能,感觉也能实现(用了感觉,因为已经彻底放弃了这种方式,从没尝试过,感觉效率太低),应该在ORM文档的查询关联模块有介绍。

3年前 评论
lmdfx (楼主) 3年前
lmdfx (楼主) 3年前

你这个圈子和动态是一对多?

3年前 评论
lmdfx (楼主) 3年前
$query = Model();
$query->where(function ($query) {
    $query->orWhere(function ($query) {
       $query->where('role', 1);
    });
    $query->orWhere(function ($query) {
       $query->where('role', 2);
       $query->where('user_id', $user_id);
    });
    $query->orWhere(function ($query) {
       $query->where('role', 3);
       $query->whereHas('quanzi', function($query){
           $query->whereIn('user_id', $user_id);
       });
    });
});
3年前 评论
Adachi 3年前
        //所有
        $one=Feeds::where("view_permission","allUser");
        //自己
        $two=Feeds::where("view_permission","creatorOnly")->where("user_id",1);
        //获取所有关注圈子id
        $topicIdArr=UserTopics::where("user_id",1)->pluck("topic_id")->toArray();
        //关注
        $data=Feeds::join("feed_topics","feed_topics.topic_id","=","feeds.feed_id")
            ->where("feeds.view_permission","memberOnly")
            ->whereIn("feed_topics.topic_id",$topicIdArr)
            ->union($one)
            ->union($two)
            ->select(["feeds.*"])
            ->paginate(20)->toArray();
3年前 评论
SELECT a.*
FROM `feeds` AS a
LEFT JOIN `feed_topics` AS b ON b.`feed_id` = a.`id` AND FIND_IN_SET(b.`topic_id`, '1,2,3')
WHERE 
    a.`view_permission` = 'allUser' 
    OR (a.view_permission = 'creatorOnly' AND a.`user_id` = 1) 
    OR (a.view_permission = 'memberOnly' AND b.id IS NOT NULL)
GROUP BY a.`id`
LIMIT 0, 20

替换一下user_id 和 topic_id

一对多的话要加一个 group by,天天用ORM,好久不写sql了,上面写的where条件还写错了23333.

3年前 评论

这个可能更适合你

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Feed extends Model
{
    public function topic()
    {
        return $this->hasMany(FeedTopic::class,'feed_id');
    }
}

----------------------------------------------------------------------------

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class FeedTopic extends Model
{
    //
}

----------------------------------------------------------------------------

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    public function topic()
    {
        return $this->hasMany(Topic::class);
    }
}

----------------------------------------------------------------------------

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Topic extends Model
{
    //
}

----------------------------------------------------------------------------

Feed::whereHas('topic', function (Builder $query) {
            $query->where('feeds.view_permission', 'allUser')
                ->orWhere(function (Builder $query) {
                    $query->where('feeds.view_permission', 'creatorOnly')
                        ->where('feeds.user_id', auth()->id() ?? 1);
                })
                ->orWhere(function (Builder $query) {
                    $query->where('feeds.view_permission', 'memberOnly')
                        ->whereIn('feed_topics.topic_id', auth()->user() ? auth()->user()->topic->pluck('id') : [1, 2, 3]);
                });
            })
            ->paginate();

sql 如下:
 SELECT
    count(*) AS AGGREGATE 
FROM
    `feeds` 
WHERE
    EXISTS (
    SELECT
        * 
    FROM
        `feed_topics` 
    WHERE
        `feeds`.`id` = `feed_topics`.`feed_id` 
        AND (
            `feeds`.`view_permission` = allUser 
            OR ( `feeds`.`view_permission` = creatorOnly AND `feeds`.`user_id` = 1 ) 
            OR (
            `feeds`.`view_permission` = memberOnly 
    AND `feed_topics`.`topic_id` IN ( 1, 2, 3 )
    )
    )
    )

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!