如何在 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";
}