如何在 eloquent 多个关系字段上使用 count 和 orderBy?

How to use count and orderBy on eloquent multiple relationship fields?

我想做的是为 table 数据设置服务器端配置。所以我有一个模型 CounterLog,它有 3 个关系集 [belongsTo] categorylocationuser。我想要一个查询来过滤所有 CounterLog 数据,包括关系,设置 offsetlimitorderBy 方法,同时检索所有过滤的行,忽略 offsetlimit。这是我到目前为止所做的,也许能更好地理解我想要什么:

$search_query = function($q) use ($search) {
    $q->where('name', 'like', '%' . $search . '%');
};

$query = CounterLog::where('created_at', 'like', '%' . $search . '%')
->orWhereHas('category', $search_query)
->orWhereHas('location', $search_query)
->orWhereHas('user', $search_query);

$logs = $query->offset($offset)->limit($limit)->get();
$logs_total = $query->offset(0)->count();

在最后一行我使用了 $query->offset(0) 因为出于某种原因如果 offset 设置为数字 $logs_total 变为 0。我不确定这是正确的方法..但即使这样我也不知道如何使用 orderBy for ex。 category.name.

我知道我总是可以在 eloquent 中使用原始查询,但我想知道是否可以使用 ORM 和关系。如果你能帮我解决这个问题,我将不胜感激……因为斗争是真实的。

非常感谢:)


显然我没有 ORM 的解决方案所以我用 "raw" 查询来解决:

$query = $this->db->table('counter_logs')
                ->leftJoin('categories', 'counter_logs.category_id', '=', 'categories.id')
                ->leftJoin('locations', 'counter_logs.location_id', '=', 'locations.id')
                ->leftJoin('users', 'counter_logs.user_id', '=', 'users.id');
                ->where('counter_logs.created_at', 'like', '%' . $search . '%')
                ->orWhere('categories.name', 'like', '%' . $search . '%')
                ->orWhere('locations.name', 'like', '%' . $search . '%')
                ->orWhere('users.name', 'like', '%' . $search . '%');
                ->select('counter_logs.id as id', 'categories.name as category', 'locations.name as location', 'users.name as user', 'counter_logs.created_at as date'); 

$json['total'] = $query->count();
$logs = $query->offset($offset)->limit($limit)->orderBy($sort, $order)->get();

尝试交换语句:

$logs_total = $query->count();
$logs = $query->offset($offset)->limit($limit)->get();

或者克隆基础查询,像这样:

$total_count_query = clone $query;
$logs = $query->offset($offset)->limit($limit)->get();
$logs_total = $total_count_query->count();