Отправлять уведомление на электронную почту только в том случае, если это адрес электронной почты пользователя, зарегистрированного в конференции

У меня есть страница, на которой пользователь может отправлять уведомления пользователям, зарегистрированным в конференции. На этой странице пользователь может выбрать, что хочет отправить уведомление всем участникам, зарегистрированным в конференции. Но пользователь также может выбрать, что он хочет отправить электронное письмо конкретному пользователю, зарегистрированному в конференции. Для этого у меня есть приведенный ниже код.

Уведомление для всех участников, зарегистрированных в конкретной конференции, работает нормально.

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

}

вы хотите добавить на participant_email подтверждение того, что адрес электронной почты должен быть зарегистрирован в конференции, верно?

rkj 30.07.2018 18:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить дополнительный фильтр к валидации 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 ")"?

user10066925 30.07.2018 19:08

да, вы можете добавить после этого, но вы должны вернуть массив $emails в этом другом состоянии.

rkj 30.07.2018 19:15

что еще делает условие? вместо этого используйте pluck, чтобы получить массив писем

rkj 30.07.2018 19:19

Я обновил вопрос полным NotificationController, проверка, когда пользователь выбирает, что хочет отправить электронное письмо для конкретной конференции, не работает должным образом. Например, пользователь выбирает, что он хочет отправить электронное письмо для определенного электронного письма, в поле электронной почты введите электронное письмо, а в полях темы и сообщения введите текст и нажмите «Отправить». Появится сообщение: «Необходимо заполнить поле электронной почты». Но должно появиться сообщение «В конференции нет зарегистрированных участников». потому что представленный адрес электронной почты не является адресом электронной почты пользователя, зарегистрированного в конференции.

user10066925 30.07.2018 19:25

Поле адреса электронной почты является обязательным, потому что поле электронной почты было заполнено пользователем.

user10066925 30.07.2018 19:25

моя ошибка, это должен быть участник_email при проверке, а затем вы можете добавить собственное сообщение для проверки

rkj 30.07.2018 19:27

Спасибо, вот как появляется "SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'member_email' в 'where clause" (SQL: выберите count (*) как агрегат из users, где participant_email = ... @ .... com и (has = регистрации)) ".

user10066925 30.07.2018 19:29

Позвольте нам продолжить обсуждение в чате.

rkj 30.07.2018 19:31

Другие вопросы по теме