gpt4 book ai didi

php - 简化数据库关系设计

转载 作者:行者123 更新时间:2023-11-29 05:50:05 25 4
gpt4 key购买 nike

我有一个 Laravel 小项目,成员可以付费参加类(class)、支付保险、参加事件,或付费通过特殊类型的考试。

所以我有 5 个表 membersclassesinsuranceeventsexams,我需要添加 payments 表,以便我可以跟踪每个表的成员(member)付款。

所以目前 payments 表将是这样的:

id      date            amount      member_id   class_id    insurance_id    event_id    exam_id
1 2019-01-01 150 2 1 NULL NULL NULL
2 2019-01-01 250 11 NULL 14 NULL NULL
3 2019-01-01 220 15 NULL NULL 6 NULL
4 2019-01-01 350 32 NULL NULL NULL 8

有没有更好的方法,而无需:class_id, insurance_id, event_id, exam_id payments 表中的字段,因为我猜这将使关系变得更加复杂,并且也可能只是使用 Laravel 作为 PHP 框架进行数据库查询。

最佳答案

我认为最好的方法是建立一对多的多态关系。

数据库/迁移设置

为此,您需要:

  • members 表,用于保存成员数据。
  • 系统中每种类型的应付实体对应一个表(保险事件考试)
  • payments 表由以下迁移构成:
Schema::create('payments', function (Blueprint $table) {
$table->increments('id');

// Payment related fields like date and amount

$table->unsignedInteger('member_id');
// Assuming id is the primary key on the members table
$table->foreign('member_id')->references('id')->on('members');

// This one will create two fields:
// - payable_type
// - payable_id
$table->morphs('payable');
});

这样,每条记录都会保存付款的成员(member)(通过 member_id)和付费实体(通过 payable_typepayable_id) .

Eloquent 模型关系

然后您必须在您的支付模型上设置变形关系,例如:

// app\Payment.php

class Payment extends Model
{
// ...
public function payable()
{
return $this->morphTo();
}

public function member()
{
return $this->belongsTo(Member::class);
}
}

您的成员(member)模型为:

// app\Member.php

class Member extends Model
{
// ...
public function payments()
{
return $this->hasMany(Payment::class);
}
}

对于每个应付实体:

// app\Insurance.php

class Insurance extends Model
{
// ...

public function payments()
{
return $this->morphMany(Payment::class, 'payable');
}
}
// app\Event.php

class Event extends Model
{
// ...

public function payments()
{
return $this->morphMany(Payment::class, 'payable');
}
}
// app\Exam.php

class Exam extends Model
{
// ...

public function payments()
{
return $this->morphMany(Payment::class, 'payable');
}
}
// app\Course.php

// I renamed "Class" payable entity to "Course"
// as "class" is a reserved keyword in PHP and
// you can't give a class the name "Class".
class Course extends Model
{
// ...

public function payments()
{
return $this->morphMany(Payment::class, 'payable');
}
}

用法

如果您需要检索用户支付的所有款项(不同类型),您只需像这样查询成员(member)模型:

$member = Member::with('payments.payable')->first();
dd($member->payments);

如果您相应地设置模型关系,Laravel 将根据每个记录的 payable_type 和 payable_id 以及匹配的 member_id 解析不同的正确 Eloquent 模型实例。

因此,$member->payments 将是 Payment 实例的集合,每个实例都与 InsuranceExamCourseEvent 类(基于数据库中存储的 payable_type)。

有关引用和更详细的用法,您可以查看 Laravel 官方文档 here .

关于php - 简化数据库关系设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55277819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com