Ich habe 4 MySQL-Tabellen und verwende PHP und Laravel 7
Jetzt möchte ich die Einzelzahlung und alle anderen Abzüge jedes Mitglieds fortlaufend anzeigen. (Angenommen, eine Person hat nur eine Zahlung)
Die Datenbankstruktur ist wie folgt
Dies ist die HTML-Tabelle, die ich anzeigen möchte
Dies ist die Abfrage, die ich verwende, aber sie dupliziert die Daten.
$payments = Payment::leftJoin('members', 'payments.member_id', '=', 'members.id') ->leftJoin('payment_deductions', 'payments.id', '=', 'payment_deductions.payment_id') ->leftJoin('deductions', 'payment_deductions.deduction_id', '=', 'deductions.id') ->select( 'members.*', 'payment_deductions.*', ) ->orderBy("member_id", "ASC") ->get()->toArray();
Das resultierende Array wiederholt jedes Mitglied basierend auf seiner Ableitung.
Gibt es eine Möglichkeit, diese Daten zu verbessern? So etwas wie eine verschachtelte Reihe von Abzügen für jedes Mitglied?
Das ist das Modell
Mitglied
namespace App; use IlluminateDatabaseEloquentModel; use CarbonCarbon; class Member extends Model { protected $fillable = [ 'full_name', 'email', 'created_by', ]; }
Zahlung
namespace App; use IlluminateDatabaseEloquentModel; class Payment extends Model { protected $fillable = [ 'member_id', 'total_amount', 'payable_amount', 'created_by', ]; public function deductions() { return $this->belongsToMany(Deduction::class,'payment_deductions')->withTimestamps(); } }
Abzug
namespace App; use IlluminateDatabaseEloquentModel; class Deduction extends Model { protected $fillable = [ 'title', 'priority', 'created_by', ]; }
在构建模型时,您非常接近并且处于正确的轨道上,您缺少的是如何在不创建另一个查询的情况下加载关系,如果您查看控制器,您将看到加载内部关系的标准方法。希望这是一个更好的概念来解决您的担忧。
供参考:https://laravel.com/ docs/9.x/eloquent-relationships#lazy-eager-loading
这样做也可以避免将来的
N+1
问题,请参阅什么是 ORM(对象关系映射)中的“N+1 选择问题”? 有关N+1
的详细信息会员模型
支付模式
推演模型
成员控制器: