Laravel空集合时在过滤器中添加新参数以获取notEmpty集合 [英] Laravel while empty collection add new parameters in filters to get notEmpty collection
问题描述
我有这个查询,他们返回一个空集合,其过滤器参数为categorie_compet_id
,值为1
.
I have this query who return an empty collection with the filter param categorie_compet_id
with value 1
.
当集合为空时,我需要更新此ID以获取notEmpty集合.
while the collection is empty i need to update this id in order to get a notEmpty collection.
categorie_compet_id
可以从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
方法:
Here's my getArbitres
method in model:
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;
}
推荐答案
您可以使用for循环.
You could use a for loop.
$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
.
Simply replace 10
by your max level.
检索时,您应该从数据库中过滤$arbitres
集合,而不是随后对其进行过滤.
You should be filtering your $arbitres
collection from the database when retrieving instead of filtering them after.
$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
,因此可以像这样过滤它们:
Update 2
Since you cannot filter the $arbitres
upon retrieval, you can filter them like this:
$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);
});
这篇关于Laravel空集合时在过滤器中添加新参数以获取notEmpty集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!