Как использовать count и orderBy для красноречивых множественных полей отношений? - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь настроить серверную конфигурацию для данных таблицы. Итак, у меня есть модель 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 для примера. category.name.

Я знаю, что всегда могу использовать необработанные запросы в eloquent, но я хочу знать, есть ли способ использовать ORM и отношения. Я был бы очень признателен, если бы вы могли помочь мне с этим .. потому что борьба реальна.

Большое спасибо:)


Очевидно, у меня нет решения с ORM, поэтому я сделал это с "необработанными" запросами:

$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();

1 Ответ

0 голосов
/ 06 мая 2018

Попробуйте поменять операторы:

$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();
...