У меня есть страница, на которой пользователь может отправлять уведомления пользователям, зарегистрированным в конференции. На этой странице пользователь может выбрать, что хочет отправить уведомление всем участникам, зарегистрированным в конференции. Но пользователь также может выбрать, что он хочет отправить электронное письмо конкретному пользователю, зарегистрированному в конференции. Для этого у меня есть приведенный ниже код.
Уведомление для всех участников, зарегистрированных в конкретной конференции, работает нормально.
Проблема заключается в отправке уведомления для определенного электронного письма, которое пользователь вводит в поле формы «members_email». Проблема в том, что электронное письмо отправляется на любой адрес электронной почты, но уведомление следует отправлять только пользователю, который зарегистрирован в конференции, в противном случае должна появиться ошибка.
Вы знаете, как этого добиться? В приведенном ниже коде работает для случая всех участников, то есть, если пользователь отправляет уведомление для всех участников и нет зарегистрированных участников, уведомление не отправляется и появляется сообщение «В конференции нет зарегистрированных участников». . Но как добиться этого, если пользователь отправляет уведомление на конкретное электронное письмо, которое не является адресом электронной почты пользователя, зарегистрированного в конференции?
public function send(Request $request, $id){
$conference = Conference::find($id);
$message = $request->message;
$subject = $request->subject;
// if the user selected that wants to send email for a specific participant of the conference
if ($request->send_to == "participant"){
$this->validate(request(), [
'participant_email' => 'required|email|exists:users,email',
]);
Mail::to($request->participant_email)->send(new Notification($conference, $message, $subject));
Session::flash('success', 'Notification sent.');
return redirect()->back();
}
// if the user selected that wants to send an email for all participants of the conference
if ($request->send_to == "all"){
$sendTo = User::whereHas('registrations', function ($query) use($id) {
$query->where('conference_id', '=', $id);
})->get();
}else{
$sendTo = User::whereHas('registrations.participants.registration_type', function ($query) use ($id, $request) {
$query->where('id', '=', $request->send_to)
->where('conference_id', '=', $id);
})->whereHas('registrations', function ($query) use ($id) {
$query->where('conference_id', '=', $id);
})->get();
}
foreach($sendTo as $user){
$usersEmail[] = $user->email;
}
if (isset($usersEmail)) {
foreach ($usersEmail as $userEmail) {
Mail::to($userEmail)->send(new Notification($conference, $message, $subject));
}
Session::flash('success', 'Notification sent with success.');
return redirect()->back();
}
else{
Session::flash('no_participants', 'There are no participants registered in the conference.');
return redirect()->back();
}
}
Обновленный код:
class NotificationController extends Controller
{
public function index($id){
$conference = Conference::find($id);
$registrationType = RegistrationType::where('conference_id', $id)->get();
return view('notifications.index')->with('conference', $conference)->with('registrationType', $registrationType);
}
public function send(Request $request, $id){
$conference = Conference::find($id);
$this->validate(request(), [
'send_to' => 'required',
'subject' => 'required',
'message' => 'required' // The message field is required.
]);
$message = $request->message;
$subject = $request->subject;
if ($request->send_to == "participant"){
$this->validate(request(), $this->participantRules($id));
$emails[] = $request->participant_email;
}
else if ($request->send_to == "all"){
$emails = User::whereHas('registrations', function ($query) use($id) {
$query->where('conference_id', '=', $id);
})->pluck('email');
}
else{
$emails = User::whereHas('registrations.participants.registration_type', function ($query) use ($id, $request) {
$query->where('id', '=', $request->send_to)
->where('conference_id', '=', $id);
})->whereHas('registrations', function ($query) use ($id) {
$query->where('conference_id', '=', $id);
})->get(); // use pluck('email') instead of get to select only email
}
if (count($emails) > 0) {
$this->sendNotification($emails, $conference, $request);
Session::flash('success', 'Notificação enviada com sucesso.');
return redirect()->back();
}else{
Session::flash('no_participants', 'There are no participants registered in the conference.');
return redirect()->back();
}
}
protected function participantRules($conferenceID){
return [
'email' => [
'required',
'email',
Rule::exists('users')->where(function ($query) use ($conferenceID) {
$query->whereHas('registrations', function ($query) use($conferenceID) {
$query->where('conference_id', '=', $conferenceID);
});
}),
],
];
}
protected function sendNotification(array $emails, $conference, $request){
foreach ($emails as $userEmail) {
Mail::to($userEmail)->send(new Notification($conference, $request->message, $request->subject));
}
Session::flash('success', 'Notificaiton sent with success.');
return redirect()->back();
}
}






Вы можете добавить дополнительный фильтр к валидации exists следующим образом
public function send(Request $request, $id){
$conference = Conference::find($id);
$message = $request->message;
$subject = $request->subject;
$emails = [];
if ($request->send_to == "participant"){
$this->validate(request(), $this->participantRules($id));
$emails = User::whereHas('registrations', function ($query) use($id) {
$query->where('conference_id', '=', $id);
})->where('email', $request->participant_email)->pluck('email');
}else if ($request->send_to == "all"){
$emails = User::whereHas('registrations', function ($query) use($id) {
$query->where('conference_id', '=', $id);
})->pluck('email');
}else{
$emails = User::whereHas('registrations.participants.registration_type', function ($query) use ($id, $request) {
$query->where('id', '=', $request->send_to)
->where('conference_id', '=', $id);
})->whereHas('registrations', function ($query) use ($id) {
$query->where('conference_id', '=', $id);
})->pluck('email');
}
if (count($emails) > 0) {
$this->sendNotification($emails, $conference, $request);
Session::flash('success', 'Notification sent with success.');
return redirect()->back();
}else{
Session::flash('no_participants', 'There are no participants registered in the conference.');
return redirect()->back();
}
}
Правила валидации
protected function participantRules($conferenceId){
return [
'participant_email' => 'required|email'
];
}
Отправить уведомление
protected function sendNotification($emails, $conference, $request){
foreach ($emails as $userEmail) {
Mail::to($userEmail)->send(new Notification($conference, $request->message, $request->subject));
}
}
Спасибо, я также обновил вопрос этой частью, потому что пользователь также может отправлять электронные письма всем участникам, связанным с определенным типом регистрации, выбранным пользователем: «else {$ sendTo = User :: whereHas ('registrations.participants.registration_type ', функция ($ query) use ($ id, $ request) {$ query-> where (' id ',' = ', $ request-> send_to) -> where (' conference_id ',' = ', $ id );}) -> whereHas ('регистрации', функция ($ query) use ($ id) {$ query-> where ('conference_id', '=', $ id);}) -> get ();} ". Нужно только добавить это после "else if ($ request-> send_to = = " all ")"?
да, вы можете добавить после этого, но вы должны вернуть массив $emails в этом другом состоянии.
что еще делает условие? вместо этого используйте pluck, чтобы получить массив писем
Я обновил вопрос полным NotificationController, проверка, когда пользователь выбирает, что хочет отправить электронное письмо для конкретной конференции, не работает должным образом. Например, пользователь выбирает, что он хочет отправить электронное письмо для определенного электронного письма, в поле электронной почты введите электронное письмо, а в полях темы и сообщения введите текст и нажмите «Отправить». Появится сообщение: «Необходимо заполнить поле электронной почты». Но должно появиться сообщение «В конференции нет зарегистрированных участников». потому что представленный адрес электронной почты не является адресом электронной почты пользователя, зарегистрированного в конференции.
Поле адреса электронной почты является обязательным, потому что поле электронной почты было заполнено пользователем.
моя ошибка, это должен быть участник_email при проверке, а затем вы можете добавить собственное сообщение для проверки
Спасибо, вот как появляется "SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'member_email' в 'where clause" (SQL: выберите count (*) как агрегат из users, где participant_email = ... @ .... com и (has = регистрации)) ".
Позвольте нам продолжить обсуждение в чате.
вы хотите добавить на
participant_emailподтверждение того, что адрес электронной почты должен быть зарегистрирован в конференции, верно?