Получение электронной почты всех пользователей по идентификатору в laravel

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

Логика

  1. Получить все идентификаторы пользователей из таблицы mailings
  2. проверьте, установлен ли их столбец latest_blog на on
  3. отправить электронное письмо этим пользователям

Код

$latest_blog = Mailing::where('latest_blog', 'on')->pluck('user_id');
$users = User::whereIn('id', [$latest_blog])->get();
foreach($users as $user){
  Mail::to($user->email)->send(new BlogUpdates($user, $post));
}

dd($latest_blog); возвращается

Collection {#1705 ▼
  #items: array:5 [▼
    0 => 41
    1 => 51
    2 => 42
    3 => 60
    4 => 61
  ]
}

dd($users); возвращает только 1 пользователя, в то время как для всех пользователей столбец latest_blog установлен на on. поэтому в основном он должен был вернуть 5 пользователей, а не 1.

Collection {#1758 ▼
  #items: array:1 [▼
    0 => User {#1756 ▶}
  ]
}

Любая идея?

Обновлять

Mailing model

protected $fillable = [
  'user_id', 'interests', 'security', 'latest_projects', 'latest_blog'
];

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

User model

protected $fillable = [
  'name', 'username', 'email', 'password', 'points', 'google2fa_secret'
];

public function mails()
{
  return $this->hasOne(Mailing::class);
}

Mailing Schema

Schema::create('mailings', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned()->nullable()->unique();
            $table->string('interests')->default('on');
            $table->string('security')->default('on');
            $table->string('latest_projects')->default('on');
            $table->string('latest_blog')->default('on');
            $table->timestamps();
        });
        Schema::table('mailings', function (Blueprint $table) {
         $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Пожалуйста, покажите нам структуру таблицы и образцы данных для обеих таблиц. Мой общий совет: полностью запустите необработанный MySQL-запрос, а затем подумайте, как его кодировать в Laravel.

Tim Biegeleisen 10.12.2018 07:29

Где вы разместили dd($users)? если вы сбросили внутренний цикл, он всегда будет отображать только пользователя.

Sagar Gautam 10.12.2018 07:30

@SagarGautam нет, это было выше foreach под $users

mafortis 10.12.2018 07:30

@TimBiegeleisen Я обновлю свой вопрос

mafortis 10.12.2018 07:31

@TimBiegeleisen обновлен.

mafortis 10.12.2018 07:35
Стоит ли изучать 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 и хотите разрабатывать...
1
5
981
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это будет работать:

$latest_blog = Mailing::where('latest_blog', 'on')->get()->pluck('user_id');
// dd($latest_blog);
$users = User::whereIn('id', $latest_blog->toArray())->get();
foreach($users as $user){
  Mail::to($user->email)->send(new BlogUpdates($user, $post));
}

pluck уже возвращает массив, так зачем нам функция ->toArray() в массиве?

Sagar Gautam 10.12.2018 07:46

@SagarGautam "В то время как большинство методов коллекции Eloquent возвращают новый экземпляр коллекции Eloquent, методы pluck, keys, zip, collapse, flatten и flip возвращают экземпляр базовой коллекции. Точно так же, если операция карты возвращает коллекцию, которая не содержит никаких Красноречивые модели, он будет автоматически добавлен в базовую коллекцию ". laravel.com/docs/5.7/eloquent-collections

Mostafa Hadian 10.12.2018 07:51

@MostafaHadian это хорошо, но я хочу сказать, что когда мы используем pluck, он вернет связанный или индексированный массив, который уже приемлем для красноречивого предложения whereIn. Так что я не думаю, что нам нужен дополнительный toArray.

Sagar Gautam 10.12.2018 07:55
Ответ принят как подходящий

Все, что вы делаете, правильно, но вы добавляете дополнительный массив в предложении whereIn. Поскольку pluck уже возвращает массив, нет необходимости снова добавлять [] в предложение whereIn, поэтому,

ваш код должен быть

$latest_blog = Mailing::where('latest_blog', 'on')->pluck('user_id');
$users = User::whereIn('id', $latest_blog)->get();
foreach($users as $user){
   Mail::to($user->email)->send(new BlogUpdates($user, $post));
}

Надеюсь, ты понимаешь.

@mafortis Я думаю, что раньше вы получали только первого пользователя в своем коде, а теперь вы получите правильных. В любом случае поздравляю.

Sagar Gautam 10.12.2018 07:51

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