如何在 Laravel 8 中按 user_id 对数组进行分组
How to group array by user_id in Laravel 8
我创建了 CRUD 应用程序。在此应用程序中,用户可以添加联系人,并在该联系人中包含他们的生日。
我在PHPMySQL中有两个table:学生和用户。当学生 table 的联系人生日时,用户将收到一封电子邮件。
为了测试电子邮件工作,我正在使用 MailHog。这是工作。
我测试那个联系人中有两个生日用户。
一位用户有一封通知电子邮件。另一个有两封通知电子邮件,因为该联系人有两个数据是两个生日。
问题是,我想向每个用户发送一个通知。因此,如果一个用户在那个生日那天有很多联系人,它会向用户发送一封电子邮件通知,而不是很多封电子邮件。
这是 MailHog 中的通知:
用户 john 有两个通知,而不是一个。
这是我的代码:
public function handle()
{
info('mail first');
sleep(1);
info('mail second');
$student = Student::whereMonth('birth', date('m-d'))
->whereDay('birth', date('d') )
->get();
foreach ($student as $mystudent) {
$user = User::find($mystudent->user_id);
Mail::to($user)->send(new WelcomeMail($mystudent));
}
// dd($userid);
echo "check email";
}
此代码在 class WelcomeMail
public function __construct($students)
{
$this->data = $students;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome')->with('students', $this->data);
}
这是在看:
{{ $students}}
我在邮件命令中做了这个修改:
$userid = [];
foreach ($student as $mystudent) {
$user = User::find($mystudent->user_id);
array_push($userid, $user);
Mail::to($user)->send(new WelcomeMail($mystudent));
}
此时,它仍然给我的结果是用户每个联系人都有很多电子邮件。
希望你能帮助我训练逻辑来解决这个问题。
+
这个数据库看起来像:
$student = Student::whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'))
->groupBy('user_id')
->get();
您可以从用户开始查询,这样您就可以确定每个用户只出现一次。
我假设您在 User::class
模型中存在 students()
关系
public function handle()
{
$users = User::wherehas('students', function($studentQuery) {
$studentQuery
->whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'));
})
->with('students', function($studentQuery) {
$studentQuery
->whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'));
})
->get();
foreach ($users as $user) {
Mail::to($user)->send(new WelcomeMail($user->students));
}
echo "check email";
}
我创建了 CRUD 应用程序。在此应用程序中,用户可以添加联系人,并在该联系人中包含他们的生日。
我在PHPMySQL中有两个table:学生和用户。当学生 table 的联系人生日时,用户将收到一封电子邮件。
为了测试电子邮件工作,我正在使用 MailHog。这是工作。
我测试那个联系人中有两个生日用户。 一位用户有一封通知电子邮件。另一个有两封通知电子邮件,因为该联系人有两个数据是两个生日。
问题是,我想向每个用户发送一个通知。因此,如果一个用户在那个生日那天有很多联系人,它会向用户发送一封电子邮件通知,而不是很多封电子邮件。
这是 MailHog 中的通知:
用户 john 有两个通知,而不是一个。
这是我的代码:
public function handle()
{
info('mail first');
sleep(1);
info('mail second');
$student = Student::whereMonth('birth', date('m-d'))
->whereDay('birth', date('d') )
->get();
foreach ($student as $mystudent) {
$user = User::find($mystudent->user_id);
Mail::to($user)->send(new WelcomeMail($mystudent));
}
// dd($userid);
echo "check email";
}
此代码在 class WelcomeMail
public function __construct($students)
{
$this->data = $students;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome')->with('students', $this->data);
}
这是在看:
{{ $students}}
我在邮件命令中做了这个修改:
$userid = [];
foreach ($student as $mystudent) {
$user = User::find($mystudent->user_id);
array_push($userid, $user);
Mail::to($user)->send(new WelcomeMail($mystudent));
}
此时,它仍然给我的结果是用户每个联系人都有很多电子邮件。
希望你能帮助我训练逻辑来解决这个问题。
+
这个数据库看起来像:
$student = Student::whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'))
->groupBy('user_id')
->get();
您可以从用户开始查询,这样您就可以确定每个用户只出现一次。
我假设您在 User::class
模型中存在 students()
关系
public function handle()
{
$users = User::wherehas('students', function($studentQuery) {
$studentQuery
->whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'));
})
->with('students', function($studentQuery) {
$studentQuery
->whereMonth('birth', date('m-d'))
->whereDay('birth', date('d'));
})
->get();
foreach ($users as $user) {
Mail::to($user)->send(new WelcomeMail($user->students));
}
echo "check email";
}