#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));
Большое вам спасибо!