Отправка электронной почты пользователям с разными ролями в Laravel 7 с использованием Mailtrap

#mysql #laravel #eloquent #mailtrap

#mysql #laravel #красноречивый #mailtrap

Вопрос:

Я создаю веб-сайт электронной коммерции, на котором я хочу отправлять электронные письма пользователям с разными ролями после завершения заказа. Я смог сделать это только для определенной роли, но как мне сделать это для разных ролей? Поскольку обычные пользователи могут быть продавцами, а продавцы также могут заказывать товары у других продавцов. Пока это шаги, которые я пробовал:

OrderController.php

 $users = User::whereHas('role', function ($q) {
        $q->where('name', 'user', 'seller');
    })->get();

    Mail::to($users)->send(new OrderCompleted($suborder));
  

Однако это работает и отправляет электронную почту только user ролям, а не seller ролям.

Это моя почтовая модель:

OrderCompleted.php

 public $suborder;

public function __construct(SubOrder $suborder)
{
    $this->suborder = $suborder;
}
  

Я также пробовал Mail::to($suborder->user->email)->send(new OrderCompleted($suborder)); , где мои SubOrder.php model следующие:

  public function user()
{
    return $this->belongsTo(User::class);
}
  

Но когда я пытаюсь использовать этот второй запрос, я получаю сообщение об ошибке Trying to get property 'email' of non-object

Как мне это сделать? Любые советы будут высоко оценены. Спасибо!

Комментарии:

1. $users это коллекция, где $suborder->user->email это не коллекция

2. Я думаю, что первый запрос, который я сделал, был лучше, поскольку я не получаю ошибок. Однако, когда я использую это, электронное письмо отправляется только «пользовательским» ролям. Таким образом, если продавец сделал заказ у другого продавца и заказ был отмечен как завершенный, электронная почта будет отправлена случайной роли «пользователя», а не роли продавца.

Ответ №1:

По вашей этой строке «отправляет электронную почту ролям пользователей, а не ролям продавца». Я полагаю, что вы хотите проверить имя как для «пользователя», так и для «продавца». Так что измените свой запрос,

 $users = User::whereHas('role', function ($q) {
        $q->whereIn('name', ['user', 'seller']);
    })->get();
  

Ваш $ q-> where проверяет только второй аргумент, т.е. пользователя в случае.

И для вашего второго вопроса я считаю, что @sta правильный.

Комментарии:

1. Привет! Спасибо за ваш ответ. Я пробовал это, но, похоже, только роль «user» была распознана запросом. Я попытался сделать заказ из учетной записи продавца, и когда я попытался пометить его как выполненный из учетной записи другого продавца, электронное письмо было отправлено на другое «пользовательское» электронное письмо, а не на электронную почту продавца, который его заказал.

2. Есть ли способ, которым я могу просто напрямую отправить электронное письмо всем ролям?

3. что вы получаете, если вы это сделаете dd($users); , также напрямую вы имеете в виду, что хотите отправлять почту, просто введя адрес электронной почты пользователя вместе с телом электронной почты, также возможно привести пример того, как выглядят данные в вашей пользовательской модели (таблица, связанная с моделью)

4. ваш dd ($ users) возвращает коллекцию пользователей, имеющих поле name amp; email в каждом из них с данными в полях email amp; name для каждого из них

5. можете ли вы попробовать перебирать получателей, используя пример, показанный в документах laravel.com/docs/8.x/mail#looping-over-recipients

Ответ №2:

Я смог отправлять электронные письма на целевые пользовательские электронные письма независимо от их ролей, используя

 Mail::to($suborder->order->user->email)->send(new OrderCompleted($suborder));
  

Большое вам спасибо!