Не уверен, что Laravel Distinct () - это то, что я должен использовать - PullRequest
2 голосов
/ 02 марта 2020

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

 public function machine_past_due(){
    $today = date('Y-m-d');
    $machines_past =Machine::distinct()
        ->whereDate('cert_date', '<', $today)
        ->with('customer')
        ->get();
    return response()->json($machines_past);
}

Ответы [ 4 ]

1 голос
/ 05 марта 2020

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

В качестве первого шага:

Customers::has('machines')->get();

предоставит вам список клиентов, у которых есть хотя бы 1 машина.

Чтобы включить ограничение даты, вы можете использовать whereHas(), чтобы сделать что-то вроде:

Customers::whereHas('machines', function (Builder $query) { 
    $query->whereDate('cert_date', '<', date('Y-m-d')); 
})->get();

Это даст вам всех клиентов, у которых есть хотя бы один компьютер соответствует условию даты. Обратите внимание, что в него не входят машины - это просто список клиентов.

Если вы хотите включить в результаты машины клиента, вам нужно использовать with(), ограничивая его то же условие даты:

Customers::whereHas('machines', function (Builder $query) { 
    $query->whereDate('cert_date', '<', date('Y-m-d')); 
})->with(['machines' => function($query) {
    $query->whereDate('cert_date', '<', date('Y-m-d')); 
}])->get();

Это предоставит вам список всех клиентов, у которых есть хотя бы один компьютер, соответствующий условию даты, и перечислит машины каждого клиента как свойство клиента, доступное как $customer->machines. Затем вы можете перебирать клиентов и делать что-то вроде (в режиме просмотра лезвия):

1 голос
/ 02 марта 2020

Вот решение для достижения вашей цели:

 public function machine_past_due(){
    $today = date('Y-m-d');
    $machines_past =Machine::distinct()
        ->whereDate('cert_date', '<', $today)
        ->with('customer')
        ->get();
    $machines_past = $machines_past->pluck('customer.property_name')->unique(); //added this line
    return response()->json($machines_past);
}
0 голосов
/ 02 марта 2020

Если то, что вы пытаетесь вернуть, - это массив различных имен клиентов из вашей коллекции компьютеров, то в коллекции laravel есть пара методов, которые могут вам помочь. Предполагая, что ваш клиент имеет отношение «toOne» и имеет атрибут name, тогда:

public function machine_past_due(){
    $today = date('Y-m-d');
    $machines_past = Machine::whereDate('cert_date', '<', $today)
        ->with('customer')
        ->get();

    $customer_names = $machines_past
        ->pluck('customer.name')
        ->unique()
        ->all();

    return response()->json($customer_names);
}

Код будет извлекать имя клиента из каждой машины, возвращенной из вашего запроса, и удаляет все дубликаты перед окончательной конвертацией. это к массиву.

0 голосов
/ 02 марта 2020

заставляет запрос возвращать только разные результаты.

Это то, что делает отличное, вот исходный код ,

, поэтому, когда вы используете разные, он будет проверять все столбцы, которые вы выбрали, который дублируется.

Вы можете использовать groupBy вместо:

$machines_past =Machine::groupBy('customer_id')
        ->whereDate('cert_date', '<', $today)
        ->with('customer')
        ->get();

И если вы используете mysql 5.7+ и вы используете строгий режим в laravel, вам необходимо отключить ONLY_FULL_GROUP_BY в laravel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...