【问题标题】:Laravel: How to order results of related models?Laravel:如何排序相关模型的结果?
【发布时间】:2019-10-30 00:36:07
【问题描述】:

我提出了以下查询生成器,我得到了准确的结果,除非我需要根据论坛的点赞数和线程总数对结果进行排序并根据它进行分页。

下面是没有排序方式的查询生成器:

$limit = isset($_GET['limit']) && !empty($_GET['limit']) && is_numeric($_GET['limit']) ? (int) $_GET['limit'] : 10;

$page = isset($_GET['page']) && !empty($_GET['page']) && is_numeric($_GET['page']) ? (int) $_GET['page'] : 1;

$offset = ($page - 1) * $limit;

$forums = Forum::where('status', 1);

if(isset($_GET['search']) && !empty($_GET['search'])) {

    $search = trim($_GET['search']);

    $forums = $forums->where(function($query) use($search) {

        $query->where('title', 'LIKE', '%' . $search . '%')->orWhere('content', 'LIKE', '%' . $search . '%');

    });

}

if(isset($_GET['category']) && !empty($_GET['category'])) {

    $forums = $forums->whereIn('category_id', explode(',', trim($_GET['category'])));

}

if(isset($_GET['sortby']) && !empty($_GET['sortby'])) {

    $sortby = trim($_GET['sortby']);

    if($sortby == 'newest') {

        $forums = $forums->latest();

    } elseif($sortby == 'oldest') {

        $forums = $forums->oldest();

    } elseif($sortby == 'popular') {

        // Sort By: Popular | Logic: Total no of likes and threads to a forum

    } else {

        $forums = $forums->latest();

    }

} else {

    $forums = $forums->latest();

}

$forums = $forums->offset($offset)->limit($limit)->get();

我在 Forum 模型中定义了 eloquent 关系如下:

public function threads()
{

    return $this->hasMany('App\ForumThread', 'forum_id', 'id');

}

public function likes()
{

    return $this->hasMany('App\ForumLike', 'forum_id', 'id');

}

论坛表架构:

CREATE TABLE `forums` (
    `id` bigint(20) UNSIGNED NOT NULL,
    `category_id` int(10) UNSIGNED NOT NULL,
    `user_id` bigint(20) UNSIGNED NOT NULL,
    `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    `content` longtext COLLATE utf8mb4_unicode_ci,
    `image` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `tags` text COLLATE utf8mb4_unicode_ci,
    `status` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL,
    `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

论坛喜欢表架构:

CREATE TABLE `forum_likes` (
    `id` bigint(20) UNSIGNED NOT NULL,
    `forum_id` bigint(20) UNSIGNED NOT NULL,
    `user_id` bigint(20) UNSIGNED NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

论坛主题表架构如下:

CREATE TABLE `forum_threads` (
    `id` bigint(20) UNSIGNED NOT NULL,
    `forum_id` bigint(20) UNSIGNED NOT NULL,
    `user_id` bigint(20) UNSIGNED NOT NULL,
    `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL,
    `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

谢谢!

【问题讨论】:

    标签: php laravel eloquent laravel-query-builder


    【解决方案1】:

    Counting Related Models
    如果你想计算一段关系的结果数 实际加载它们你可以使用 withCount 方法,这将 在生成的模型上放置一个 {relation}_count 列。

    因此,您可以使用withCount(),然后按放置的列对结果进行排序。例如对于“喜欢”关系:

    } elseif ($sortby == 'popular') {
        $forums = $forums->withCount('likes')->orderBy('likes_count', 'desc');
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2019-05-27
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多