Проблема с упорядочиванием базы данных Laravel при использовании объединений и упорядочением по - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть проект, над которым я работаю, и у меня есть модель Staff, Customer & Sale.

Как и ожидалось, Staff может иметь множество Sale с одним Customer - A Customer также может иметь множество Sale с.

В представлении, над которым я работаю, я хочу отобразить все Customer, принадлежащие элементу Staff, но отображать каждый Customer только один раз (DISTINCT, GROUP BY?), Но в порядке наиболее недавний Sale (sale_date, DESC).

Я пробовал много разных способов показать это, но в настоящее время есть этот код:

Customer::join('sales', 'customers.id', '=', 'sales.customer_id')
->where('sales.staff_id',$id)
->orderBy('sales.sale_date', 'DESC')
->select('customers.*')
->get();

Который работает по большей части, за исключением странной записи, где в середине августа будет запись с сентября. Вот несколько других способов, которые я пробовал:

$staff->sales()->orderBy('sale_date','DESC')->distinct('customer_id')->get();

Sale::select(DB::raw('s.*'))
->from(DB::raw('(SELECT * FROM sales WHERE staff_id = '.$id.' ORDER BY sale_date DESC) s'))
->groupBy('s.customer_id')
->orderBy('sale_date','DESC')
->get();

Я не особо возражаю, чтобы вернуть коллекцию Sale с, так как я мог бы изменить свое представление, чтобы получить Customer для каждого Sale

Любая помощь / совет будет принята с благодарностью!

РЕДАКТИРОВАТЬ: Просто также заметил, даже не получить больше клиентов тоже: (

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Используйте модифицированный withCount(), чтобы получить последнюю продажу с подзапросом:

 Customer::withCount(['sales as sale_date' => function($query) {
        $query->select(DB::raw('max(sale_date)'));
    }])
    ->where('sales.staff_id', $id)
    ->orderByDesc('sale_date')
    ->get();
0 голосов
/ 11 сентября 2018

В соответствии с документацией присоединения функция объединения использует БД, а не модель напрямую, поэтому попробуйте заменить Sale::select на DB::table('sales').

...