如何在 eloquent 多个关系字段上使用 count 和 orderBy?
How to use count and orderBy on eloquent multiple relationship fields?
我想做的是为 table 数据设置服务器端配置。所以我有一个模型 CounterLog
,它有 3 个关系集 [belongsTo
] category
、location
、user
。我想要一个查询来过滤所有 CounterLog
数据,包括关系,设置 offset
、limit
和 orderBy
方法,同时检索所有过滤的行,忽略 offset
和 limit
。这是我到目前为止所做的,也许能更好地理解我想要什么:
$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();
我想做的是为 table 数据设置服务器端配置。所以我有一个模型 CounterLog
,它有 3 个关系集 [belongsTo
] category
、location
、user
。我想要一个查询来过滤所有 CounterLog
数据,包括关系,设置 offset
、limit
和 orderBy
方法,同时检索所有过滤的行,忽略 offset
和 limit
。这是我到目前为止所做的,也许能更好地理解我想要什么:
$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();