Передача переменной в запрос создает ошибку «Попытка получить свойство« имя »необъекта» с Laravel - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Laravel 6. Я пытаюсь создать систему проверки с формой для создания собрания. Когда пользователь создает собрание с участниками, которые уже заняты на другом собрании, в представлении должно появиться сообщение с именем уже занятых участников. По какой-то причине функция, которая должна найти имя участников, не работает. Я передаю идентификатор во время цикла foreach, но при запуске формы появляется следующее сообщение: «Попытка получить свойство« имя »необъекта». Странно то, что переданный в функцию идентификатор в порядке, но если я напишу число (например, «8») вместо $ id в запросе, в представлении будет правильно отображено имя «Крис». Формат столбца «id_participants» в таблице собраний следующий: «23; 7; 6».

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use DB;
use App\User;



class CheckParticipant implements Rule
{
    protected $participants_occupied = array();


    /**
     * 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)
    {
        $participants = request('participants');

        foreach($participants as $participant) {

            $meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('date', request('date_meeting'))
            ->where(function ($query) {
                $query->where(function($sub_q) {
                        $sub_q->where('start_hour', '>=', request('start'))
                                ->where('start_hour', '<', request('end'));
                    })
                    ->orWhere(function($sub_q) {
                        $sub_q->where('start_hour', '<', request('start'))
                                ->where('end_hour', '>=', request('end'));
                    })
                    ->orWhere(function($sub_q) {
                        $sub_q->where('end_hour', '>', request('start'))
                                ->where('end_hour', '<=', request('end'));
                    });
            })
            ->where(function ($query) use($participant) {
                $query->where('id_participants', $participant)
                    ->orWhere('id_participants', 'like', '%;'.$participant)
                    ->orWhere('id_participants', 'like', $participant.';%')
                    ->orWhere('id_participants', 'like', '%;'.$participant.';%');
            })
            ->get();

            if(count($meetings) > 0) {
                array_push($this->participants_occupied, $participant);
            }
        }

        if(count($this->participants_occupied) > 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        for($i = 0; $i < count($this->participants_occupied); $i++) {
            $this->participants_occupied[$i] = $this->getNameSurnameById($this->participants_occupied[$i]);
        }
        return 'The participants are already occupied at that time: ' . implode(',', $this->participants_occupied);

    }

    public function getNameSurnameById($id)
    {
        $users = User::all()->where('id', 18)->first(); //if I write a number in place of $id everything works

        return $users->name;
    }

}

Я бы хотел, чтобы эта программа работала динамически. Я предполагаю, что что-то не так в запросе с переменной $ id. Может ли кто-нибудь помочь мне?

ОБНОВЛЕНИЕ:

Я решил проблему, изменив функцию сообщения следующим образом:

public function message()
{
    $arr_names = array(); //I created this array

    for($i = 0; $i < count($this->participants_occupied); $i++) {
        array_push($arr_names, $this->getNameSurnameById($this->participants_occupied[$i]));
    }

    return 'The following participants are already occupied at that time: ' . implode(', ', $arr_names);


}

Я полагаю, чтопроблема заключалась в том, что я дал строковое значение (имя участника) массиву, в котором были целые значения (идентификатор участника). Я решил создать новый пустой массив и поместил имена в новый массив.

1 Ответ

1 голос
/ 04 ноября 2019

Возможно, вам будет гораздо проще получить ваши id на основе некоторого типа объекта Laravel, а не массива. Я подозреваю, что массив имеет неправильное значение (не id) с индексом $i во время цикла в какой-то момент. И, как указано в комментариях @ Cristóbal Ramos Merino, вы устанавливаете переменную в потенциальную строку (имя пользователя) в то же время, когда пытаетесь передать возможный id через метод getNameSurnameById(),

Я бы взял все id s, переданные из формы, сделал бы запрос БД на Пользователь , чтобы увидеть, кто уже занят, а затем просто извлек имя из полученной коллекции. .

Что-то вроде:

$allFormUsers = User::whereIn('id', $formIds)->get();

Затем выполните цикл для получения имен занятых:

$occupiedNames = [];
foreach($AllFormUsers->where('occupied', 1) as $u){
     $occupiedNames[] = $u->name;
}

Понятия не имею, как вы отслеживаете занятых- и поэтому приведенный выше код представляет собой нечто большее, чем псевдокод, но, надеюсь, даст вам представление о том, как сделать это без массива / параллелизма. Это также немного меньше работы с базой данных, так как у вас есть один запрос, вместо того, чтобы каждый раз выполнять циклы по отдельным запросам. Вы даже можете сначала вытащить всех пользователей, чтобы они были сохранены, а затем, если хотите, сделать where('occupied', 1) для коллекции, как в приведенном выше цикле. (Предполагая, что вы так заняты, трек)

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