Laravel пока пустая коллекция добавляет новые параметры в фильтры, чтобы получить коллекцию notEmpty - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть этот запрос, который возвращает пустую коллекцию с параметром фильтра categorie_compet_id со значением 1.

, пока коллекция пуста, мне нужно обновить этот идентификатор, чтобы получить коллекцию notEmpty.

categorie_compet_id может go от 1 до 10.

Как я могу сделать это правильно?

$arbitres = Licencies::getArbitres();
    $arbitres->load('rencontreOfficiels');
    $arbitres->load('divisions');

$arbitres = $arbitres->reject(function ($arbitre) use ($rencontre) {
    return $arbitre->rencontreOfficiels->contains(function ($rencontreOfficiels) use ($rencontre) {
        return $rencontreOfficiels->rencontre_id === $rencontre->id;
    });
})->filter(function ($arbitre) {
    return $arbitre->divisions->contains('categorie_compet_id', 1);
})->filter(function($arbitre) {
    return $arbitre->level >= 3;
});

ОБНОВЛЕНИЕ

$arbitres->load('rencontreOfficiels');
$arbitres->load('divisions');

$arbitres = $arbitres->reject(function ($arbitre) use ($rencontre) {
    return $arbitre->rencontreOfficiels->contains(function ($rencontreOfficiels) use ($rencontre) {
        return $rencontreOfficiels->rencontre_id === $rencontre->id;
    });
})->filter(function ($arbitre) {
    return $arbitre->divisions->contains('categorie_compet_id', 1);
})->filter(function($arbitre) use ($rencontre) {
    return $arbitre->doesnthave('rencontreOfficiels')->where('rencontreOfficiels.dt_rencontre' , $rencontre->dt_rencontre);
});

//on génére les meilleurs arbitres
for ($i = 1; $i < 7; $i++) {
    $filtered = $arbitres->filter(function ($arbitre) use ($i) {
        return $arbitre->level <= $i;
    });

    if ($filtered->isNotEmpty()) {
        $arbitres = $filtered;
        break;
    }
}

Вот мой getArbitres метод в модели:

public static function getArbitres(){
    $all_licences = Licencies::whereIn('activite_licencie_id' , [24,25,50,80])
        ->where('valid_licence_id' , 3)
        ->where('saison_id' , self::getSaison()->id)
        ->where('dispo' , 1)
        ->get();

    return $licences;
}

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать для l oop.

$arbitres = $arbitres->reject(function ($arbitre) use ($rencontre) {
    return $arbitre->rencontreOfficiels->contains(function ($rencontreOfficiels) use ($rencontre) {
        return $rencontreOfficiels->rencontre_id === $rencontre->id;
    });

for ($i = 3; $i < 10; $i++) {
    $filtered = $arbitres->filter(function ($arbitre) use ($i) {
        return $arbitre->level >= $i;
    });

    if ($filtered->isNotEmpty()) {
        $arbitres = $filtered;
        break;
    }
}

Просто замените 10 вашим максимальным уровнем.

Обновите

Вы должны фильтровать свои $arbitres сбор из базы данных при извлечении вместо фильтрации после.

$arbitres = App\Arbitres::whereHas('rencontreOfficiels', function ($query) use ($rencontre) {
    $query->where('rencontre_id', $rencontre->id);
})->whereDoesntHave('rencontreOfficiels', function ($query) use ($rencontre) {
    $query->where('dt_rencontre', $rencontre->dt_rencontre);
})whereHas('divisions', function ($query) {
    $query->where('categorie_complet_id', 1);
})->get();

Обновление 2

Поскольку вы не можете отфильтровать $arbitres при извлечении, вы можете отфильтровать их следующим образом:

$arbitres = $arbitres->reject(function ($arbitre) use ($rencontre) {
    return $arbitre->rencontreOfficiels->contains(function ($rencontreOfficiels) use ($rencontre) {
        return $rencontreOfficiels->rencontre_id === $rencontre->id;
    });
})->filter(function ($arbitre){
    return $arbitre->divisions->contains('categorie_compet_id', 1);
})->filter(function($arbitre) use ($rencontre){
    return ! $arbitre->rencontreOfficiels->contains('dt_rencontre' , $rencontre->dt_rencontre);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...