【问题标题】:Laravel random collection without an existing stored item in another collection relationLaravel 随机集合,在另一个集合关系中没有现有存储项
【发布时间】:2020-02-15 14:54:55
【问题描述】:

我想从一个集合中随机获取一个项目。如果我的 $candidat_exist 集合中已经存在随机项目,我想再次随机以获得与 rencontre_officiel 表中存储的项目不同的项目

我在想这样的事情会奏效

        \\App\Licencies collection
        $candidat = $arbitres->random();

        $candidat_exist = \App\RencontreOfficiel::where('licencie_id' , $candidat->id)->where('rencontre_id' , $rencontre->id)->exists();

        while ($candidat_exist){
            $candidat = $arbitres->random();
        }

        dd($candidat);

我的 $candidat_exist 是真的,所以我想随机分配另一个值

更新:

$arbitres = Licencies::getArbitres();

我在模型中的函数 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;

这是我与许可证模型的模型关系:

class RencontreOfficiel extends Model
{
    public function rencontre(){

        return $this->belongsTo('App\Rencontre' , 'rencontre_id');
    }

    public function licence(){

        return $this->belongsTo('App\Licencies' , 'licencie_id');
    }
}

这是我与关系部门的班级许可

public function divisions(){
        return $this->hasMany(LicenceDesignationDivision::class , 'licence_id');
    }

这里是我的 $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){

                return $arbitre->level >= 3;

            });

我需要检查我是否有一个空集合,我需要更改 categorie_compet_id 值,如果我仍然什么都没有,我需要更改级别条件。

我怎样才能真正做到这一点?

【问题讨论】:

  • 您能解释一下您想通过该解决方案实现什么目标吗?你能描述一下原来的问题吗?也许您可以先过滤项目以避免挑选一些项目。否则,使用您的方法,您最终会为每次检查进行数据库调用,这会使性能变差。
  • @mdexp 感谢您的回复我想简单地检查我的表格 rencontre_officiel 我已经通过该方法随机检索了候选人,如果是这种情况,我想选择另一个候选人以便不要得到相同的。没有数据库我怎么能做到这一点?
  • 如何填充/检索$arbitres 集合?也许您可以在那里应用一些过滤以避免数据库调用
  • LicenciesRecontreOfficiel 模型之间有什么关系吗?如果可以,您可以同时发布这两个模型吗?
  • @mdexp 是的,我有一个从 RencontreOfficiel 到 Licencies 的 belongsTo 关系

标签: laravel


【解决方案1】:

您可以通过排除已经与RecontreOfficiel 记录有关系的所有模型来缩小搜索范围,而不是获取所有Licencies 记录。

我假设每个Licencies 模型可以有多个RecontreOfficiel 模型。

在您的Licencies 中,您应该具有以下关系:

public function recontreOfficiels()
{
    return $this->hasMany('App\RencontreOfficiel', 'licencie_id');
}

然后您可以使用以下命令过滤仲裁集合:

# Load arbitres
$arbitres = Licencies::getArbitres();
# Load relationship with RecontreOfficiel model
$arbitres->load('recontreOfficiels');

# Reject arbitres which any of its recontreOfficieles
# is already associated with the $recontre model
$arbitres = $arbitres->reject(function ($arbitre) use ($recontre) {
    return $arbitre->recontreOfficiels->contains(function($recontreOfficiele) use ($recontre) {
        return $recontreOfficiels->recontre_id === $recontre->id;
    });
});

# Then you should end up with a list of not associated arbitres that you can pluck from
$arbitres->random();

最好的解决方案是在获得所有仲裁时使用whereDoesntHave 方法,但这需要对代码进行重大修改。


更新

如果您需要应用更多条件,可以通过在拒绝后链接其他方法来实现:

$arbitres = $arbitres->reject(function ($arbitre) use ($recontre) {
    return $arbitre->recontreOfficiels->contains(function($recontreOfficiele) use ($recontre) {
        return $recontreOfficiels->recontre_id === $recontre->id;
    });
})->where('level', '>=', 5); // Here you take only arbitres with level greater than 5

你可以在collections documentation看到所有可用的方法

【讨论】:

  • 是否可以制作这样的东西 $new_candidat = $arbitres->where('id' , '!=' , $arbitres->id)->random() ?
  • 当我得到随机的 $arbitres 时,我会进行一些测试,如果它不是正确的仲裁器,我想寻找另一个
  • 什么决定随机值是否正确?基本思想是只在$arbitres 集合中获取有效的集合,以避免在提取随机集合后进一步检查。如果您需要进行更多检查,则需要在调用 ->random(); 之前添加这些检查
  • 感谢您的回复!当我得到一个随机仲裁时,我需要检查他的分数水平,例如如果随机仲裁的分数水平较低,我需要检查另一个@mdexp
  • 我可以像 $arbitre->level 那样访问关卡
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2022-01-15
  • 1970-01-01
  • 2017-07-18
  • 2017-10-10
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多