Reputation: 167
I need output user payments history. With payment method detail. Like card or paypall data for each payment
<table border="1">
<tr>
<th>
</th>
<th>
summ
</th>
<th>
date
</th>
<th>
payment method
</th>
<th>
subscription
</th>
<th></th>
</tr>
@foreach($user -> payments()->get() as $payment)
<tr>
<td>
{{$payment->type}}
</td>
<td>
{{$payment->amount}}$
</td>
<td>
{{$payment->created_at}}
</td>
<td>
@if($payment -> payment_method()->first()->type == PaymentMethod::PAYPAL_ACCOUNT)
<div><strong>Paypal: </strong> {{ $payment -> payment_method() -> first() -> paypal_email }}</div>
@else
<div><strong>Card: </strong>{{ $payment -> payment_method() -> first() -> card_brand }} **** **** **** {{ $payment -> payment_method() -> first() -> card_last_four }}</div>
@endif
</td>
<td>
<div><strong>plan:</strong> {{ $payment->subscription->plan->name }}</div>
<div><strong>period:</strong> {{ $payment->period_start->format('d.m.Y')}} - {{ $payment->period_end->format('d.m.Y') }}</div>
</td>
<td>
@if (!empty($payment -> void_at))
<div>void {{ $payment -> void_at }}</div>
@elseif (!empty($payment->refund_at))
<div>refunded {{ $payment->refund_at }} </div>
@elseif(!empty($payment->refunded_transaction_id ))
<div>refund</div>
@endif
</td>
</tr>
@endforeach
</table>
This code generates many sql request's in each cycle iteration:
select * from `payment_method` where `payment_method`.`id` = '3' and `payment_method`.`deleted_at` is null limit 1
select * from `payment_method` where `payment_method`.`id` = '3' and `payment_method`.`deleted_at` is null limit 1
My models:
User class. With realation to payment one to many
class User extends Authenticatable
{
public function payments()
{
return $this->hasMany(Payment::class, $this->getForeignKey())->orderBy('created_at', 'desc');
}
}
Payment class with relation to payment method one to one
class Payment extends Model
{
public function payment_method()
{
return $this->belongsTo(PaymentMethod::class, 'payment_method_id', 'id');
}
How change my code for avoid this
Upvotes: 0
Views: 282
Reputation: 167
i do Eeager loading two relation
class User
....
public function paymentWithMethod()
{
return $this->payments()->with('payment_method', 'subscription.plan')->get();
}
Upvotes: 0
Reputation: 220
You can try like this:
$user = User::with("payments")->find($user_id);
and use foreach
@foreach($user->payments as $payment)
{{$payment->type}}
@endforeach
Off course, you can change this piece of code as you wish.
Upvotes: 1