Laravel отношение один ко многим - получить первое отношение, где оно соответствует условию - PullRequest
0 голосов
/ 16 января 2020

В Laravel У меня есть модель Client, которая имеет отношение один ко многим с моделью Activity. Это отношение просто определяет, какие действия необходимо выполнить для определенного c клиента.

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

public function activities() {
    return $this->hasMany('App\Models\Activities', 'ccid')->where('fdate', '!=', '0000-00-00')->where('archive', 'n')->orderBy('fdate', 'DESC');
}

На данный момент у меня есть несколько фильтров и Я хочу отфильтровать клиентов для извлечения на основе вида деятельности, который необходимо выполнить в их учетной записи. Например, я хочу получить все клиенты, у которых есть активность: Продажа .

Вот так я получаю все действия, которые принадлежат клиенту, где тип соответствует.

$clients = Client::with(['activities']);

if(isset($params['type']) && !empty($params['type'])){
        $activityType = $params['type'];
        $clients->whereHas('activities', function($query) use($activityType) {
            $query->where('type', $activityType);
        });
    }

В идеале, при фильтрации я должен извлекать всех клиентов, у которых есть операция Продажи, упорядоченная по ближайшей операции, которая должна быть сделана следующей (ближайшая fdate).

Похоже, это работает как-то, но в некоторых случаях у объекта клиента есть действия, которые не только Продажа .

Как получить только операции продажи для каждого клиента, заказанного ближайшим (fdate)

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Попробуйте подойти к нему со стороны Деятельности:

Activities::where('type', $type)->get();

Вы также можете связать свои where() команды до конца, например:

Activities::where('type', $type)->where('fdate', '!=', '0000-00-00')->where('archive', 'n')->orderBy('fdate', 'DESC');

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

Плюс, теперь, когда это коллекция, Вы можете выполнять любые другие виды фильтрации / сортировки / группировки, которые вам необходимы.

0 голосов
/ 16 января 2020

Метод whereHas возвращает клиентов с хотя бы одним действием данного типа. Вместо этого вы можете использовать обратное и сказать

$clients->whereDoesntHave('activities', function ($query) use ($activityType) {
    $query->where('type', '!=', $activityType);
});

. Это вернет всех клиентов, у которых нет действий, для которых тип не является $activityType

...