Использование количества результатов запроса для правила проверки (даже если оно пустое) - PullRequest
1 голос
/ 13 октября 2019

Я создал пользовательское правило проверки fiveMaxThemesChoice, которое состоит в том, что, как следует из названия, оно ограничивает пользователя (Etudiant) максимальным выбором 5 themes в приложении, которое я создаю. Это логика ниже для EtudiantsChoixTheme Eloquent, где я регистрирую варианты:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\EtudiantsChoixTheme;

class fiveMaxThemesChoice implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $choixEtudiants = EtudiantsChoixTheme::all();

            foreach ($choixEtudiants as $choixEtudiant) {
                  $IdEtudiantOccurences = count($choixEtudiants->where('idEtudiant', auth()->user()->id));
                if($IdEtudiantOccurences <= 5){
                    return true;
                }
                else{
                    return false;
                }
            }
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'You have already chosen a maximum of 5 themes.';
    }
}

Когда в таблице есть хотя бы 1 запись, это работает. Проблема состоит в том, что когда таблица пуста, возвращается сообщение об ошибке проверки, даже если в таблице еще нет записей, поэтому не максимум 5 (поэтому <= 5 должно быть правильным),Почему это не работает?

Я пробовал с другим синтаксисом:

$IdEtudiantOccurences = count($choixEtudiants->where('idEtudiant', auth()->user()->id)->first());
$IdEtudiantOccurences = $choixEtudiants->where('idEtudiant', auth()->user()->id)->first()->count();
$IdEtudiantOccurences = $choixEtudiants->where('idEtudiant', auth()->user()->id)->count();

Та же проблема сохраняется, когда таблица пуста. У кого-нибудь есть представление о том, в чем здесь может быть проблема? Любая помощь или предложение приветствуется

Ответы [ 2 ]

3 голосов
/ 13 октября 2019
<?php
declare(strict_types=1);

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\EtudiantsChoixTheme;

final class FiveMaxThemesChoice implements Rule
{
    private const MAXIMUM_NUMBER_OF_THEMES = 5;

    public function passes($attribute, $value): bool
    {
        $idEtudiant = auth()->user()->id;
        $etudiantsQuery = EtudiantsChoixTheme::where('idEtudiant', $idEtudiant);

        return $etudiantsQuery->count() <= self::MAXIMUM_NUMBER_OF_THEMES;
    }

    public function message(): string
    {
        return 'You have already chosen a maximum of 5 themes.';
    }
}

Вместо того, чтобы извлекать все (EtudiantsChoixTheme::all();), попробуйте выполнить запрос напрямую и запросить сумму после него (EtudiantsChoixTheme::where(...)->count())

Я взял эту идею из официального документа: https://laravel.com/docs/4.2/queries

0 голосов
/ 13 октября 2019

Итак, вот ваше исходное тело для passes():

public function passes($attribute, $value)
{
        $choixEtudiants = EtudiantsChoixTheme::all();

        foreach ($choixEtudiants as $choixEtudiant) {

            $IdEtudiantOccurences = count($choixEtudiants->where('idEtudiant', auth()->user()->id));
            if($IdEtudiantOccurences <= 5){
                return true;
            }
            else{
                return false;
            }
        }
    // So what value is returned here? PHP says NULL
}

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

public function passes($attribute, $value)
{
    $choixEtudiants = EtudiantsChoixTheme::all();

    foreach ($choixEtudiants as $choixEtudiant) {

        $IdEtudiantOccurences = count($choixEtudiants->where('idEtudiant', auth()->user()->id));
        if($IdEtudiantOccurences <= 5){
            return true;
        }
        else{
            return false;
        }
    }
    return false ;
}

Эта версия относится к той, в которой отсутствует требование.

...