请问laravel如何实现通过a表获取与之多态关联的b表的数据并进行分页筛选

问题描述

我现在有一个 publish 表,用于记录发布的数据的记录,它的字段如下:

clipboard.png

还有发布详细数据表若干,分别为 publish_article,publish_activity,表的结构都如下图类似:

clipboard.png

publish 表与其他数据表存在 多态关联,我需要获取某用户发布的所有数据中指定数量的数据,并对数据进行过滤,去除掉 is_drafts = 1 与 visible = 0 的数据

自己尝试过哪些方法

① 我尝试过改表,将用于判断的字段(is_drafts,visible)移动到 publish 表中,但是除此以外我的点赞表和收藏表也是和 publish 表一样的结构与功能,而我不想每个表里面都有 is_drafts,visible这些字段,感觉字段冗余了,所以这个方法被我放弃了。
② 我也尝试过从 publish 表取出分页后的数据在去获取详细数据再去过滤,但是过滤后的数据达不到分页要求的数据数量。所以我也放弃了。

目前能想到的就这两种方法,请问各位大神怎样才能在多态关联的情况下达到又能分页又能过滤数据的效果呢?

阅读 2.4k
2 个回答

两个方案,内连、HasOne

UserPublish.php

clipboard.png

调用

clipboard.png

回显

clipboard.png

执行记录

clipboard.png

新手上路,请多包涵

下面这是我的表结构,user_publish 是记录表,其它是相关的数据表

CREATE TABLE `user_publish`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `publish_type` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '对象类型',
  `publish_id` int(11) NOT NULL COMMENT '对象id',
  `created_at` timestamp(0) NULL DEFAULT NULL,
  `updated_at` timestamp(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
)

CREATE TABLE `publish_article`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `title` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题',
  `content` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '详情',
  `images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '封面',
  `visible` tinyint(4) NOT NULL DEFAULT 1 COMMENT '是否显示,0否1显',
  `is_drafts` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否草稿,0否1是',
  `created_at` timestamp(0) NULL DEFAULT NULL,
  `updated_at` timestamp(0) NULL DEFAULT NULL,
  `deleted_at` timestamp(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
)

CREATE TABLE `publish_activity`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `title` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题',
  `content` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '详情',
  `images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '封面',
  `visible` tinyint(4) NOT NULL DEFAULT 1 COMMENT '是否显示,0否1显',
  `is_drafts` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否草稿,0否1是',
  `created_at` timestamp(0) NULL DEFAULT NULL,
  `updated_at` timestamp(0) NULL DEFAULT NULL,
  `deleted_at` timestamp(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
)

这是我的查询语句,但是这种方式不支持 morph 的关联关系。 @唯一丶

$data = $this->model->whereHas('publish', function($query) {
    $query->where('is_drafts', 0);
})->get();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题