Laravel случайная коллекция без существующего сохраненного элемента в другом отношении коллекции - PullRequest
0 голосов
/ 15 февраля 2020

Я хотел бы получить случайный предмет из коллекции. если случайный элемент уже существует в моей коллекции $ 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);

my $ candidat_exist имеет значение true, поэтому я хотел бы произвольно назначить другое значение

ОБНОВЛЕНИЕ:

$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;

Здесь моя модель отношений с моделью Licencies:

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->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;

            });

Мне нужно проверить, есть ли у меня пустая коллекция, мне нужно изменить значение categoryorie_compet_id, и если я все еще ничего не получаю, мне нужно изменить условие уровня.

как я могу достичь этого быстро?

1 Ответ

2 голосов
/ 15 февраля 2020

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

Я предполагаю, что каждая модель 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

Вы можете увидеть все доступные методы в документации коллекций

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