Пользователи хранят планы в таблице invoices
.Эти планы основаны на месячной основе.
Что мне нужно сделать
Я хочу добавить новую строку для пользователя, если истек срок действия его плана, и они не продлили свои планы (я не знаюне хотите обновлять старый)
Проблема
У каждого пользователя есть неограниченное количество строк в таблице invoices
, поскольку они обновляются каждый месяц.Теперь, когда я пытаюсь получить их последнюю строку и проверить дату истечения срока действия, она получает и другие строки этих пользователей.
Пример
- У моего пользователя
3 rows
в invoices
- два из них уже просрочены и обновлены, текущим является
id=3
- , когда я пытаюсь истечь это
id=3
и создать id=4
для этого пользователя - он получает все
3 rows
и отправляет пользователю 3 электронных письма.
Код
public function handle()
{
$invoices = Invoice::where('plan_expire', '<=', Carbon::now())->get();
$current = Carbon::now();
$expiredatetime = $current->addDays(30);
$useType = Type::where('name', 'Free')->first();
foreach($invoices as $invoice)
{
Invoice::create([
'user_id' => $invoice->user->id,
'type_id' => $useType->id,
'amount' => $useType->price,
'status' => 'Approved',
'plan_expire' => $expiredatetime->toDateTimeString(),
]);
Mail::to($invoice->user->email)->send(new UserPlansReset($invoice));
}
}
User model
public function invoices()
{
return $this->hasMany(Invoice::class);
}
Invoice model
protected $fillable = [
'user_id', 'type_id', 'amount', 'status', 'plan_expire',
];
protected $casts = [
'plan_expire' => 'datetime',
];
public function user()
{
return $this->belongsTo(User::class);
}
Вопрос
Есть ли у вас какие-либо идеи, как я могу получить только последнюю строку пользователей в таблице invoices
?
Обновление
на основе ответов нижеЯ изменил свой код на:
$current = Carbon::now();
$expiredatetime = $current->addDays(30);
$useType = Type::where('name', 'Free')->first();
$users = User::all();
foreach($users as $user){
$latestInvoice = $user->invoices()->latest()->first();
if(!empty($latestInvoice) && $latestInvoice->plan_expire <= Carbon::now()){
Invoice::create([
'user_id' => $user->id,
'type_id' => $useType->id,
'amount' => $useType->price,
'status' => 'Approved',
'plan_expire' => $expiredatetime->toDateTimeString(),
]);
Mail::to($user->email)->send(new UserPlansReset($user));
}
}
Теперь эта функция вернет
Expected response code 220 but got an empty response
и не будет отправлять письма .