Я использую 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);
}
Я полагаю, чтопроблема заключалась в том, что я дал строковое значение (имя участника) массиву, в котором были целые значения (идентификатор участника). Я решил создать новый пустой массив и поместил имена в новый массив.