在 Laravel 中扩展 Eloquent 个模型(使用不同的表)
Extending Eloquent Models in Laravel (use different tables)
我正在构建一个涉及跟踪不同类型潜在客户的 Laravel 应用程序。例如,有 Refinance 线索 和 Purchase 线索。
由于线索共享很多信息和功能,但不是全部,我的想法是创建一个 Lead
class,扩展 Laravel 的 Model
class,然后是 RefinanceLead
class,它扩展了 Lead
class。
所以我会:
class Lead extends Model
{
// shared lead stuff
}
class RefinanceLead extends Lead
{
// stuff specific to refinance leads
}
我的问题是:
- 这个策略有意义吗?
- 如果是,Eloquent 将如何处理数据?我会有
leads
table 和 refinance_leads
table 吗?
- RefinanceLead class 的新实例是否会利用
leads
table 中的任何内容?
我无法通过文档回答这个问题,但如果我错过了解释的地方,请告诉我。谢谢。
1. 是的,在父模型中拥有所有通用功能非常有意义。
2. 基本上每个 Eloquent 模型都会处理来自 protected $table
变量中定义的自己 table 的数据。您可以覆盖父变量,为所有不同的子模型设置单独的 table。 Laravel Table Names
例如,如果您在 RefinanceLead 实例上使用 getId()
方法,它将 return id来自 refinance_lead table。如果您在 PurchadeLead 实例上使用它,它将从 purchade_table[ 中退出 id
class Lead extends Model
{
public function getId() {
return $this->id;
}
}
class RefinanceLead extends Lead
{
protected $table = 'refinance_leads';
}
class PurchaseLead extends Lead
{
protected $table = 'purchase_leads';
}
3. 我不知道你的确切需求是什么,但总的来说我会建议将 Lead class 抽象化,这样你就不需要为它关联一个 table 。仅使用它来分隔通用功能、关系等...
当然,正如评论中所建议的那样,实现一个接口总是一个好主意。
abstract class Lead extends Model implements LeadContract
{
// class body
}
我正在构建一个涉及跟踪不同类型潜在客户的 Laravel 应用程序。例如,有 Refinance 线索 和 Purchase 线索。
由于线索共享很多信息和功能,但不是全部,我的想法是创建一个 Lead
class,扩展 Laravel 的 Model
class,然后是 RefinanceLead
class,它扩展了 Lead
class。
所以我会:
class Lead extends Model
{
// shared lead stuff
}
class RefinanceLead extends Lead
{
// stuff specific to refinance leads
}
我的问题是:
- 这个策略有意义吗?
- 如果是,Eloquent 将如何处理数据?我会有
leads
table 和refinance_leads
table 吗? - RefinanceLead class 的新实例是否会利用
leads
table 中的任何内容?
我无法通过文档回答这个问题,但如果我错过了解释的地方,请告诉我。谢谢。
1. 是的,在父模型中拥有所有通用功能非常有意义。
2. 基本上每个 Eloquent 模型都会处理来自 protected $table
变量中定义的自己 table 的数据。您可以覆盖父变量,为所有不同的子模型设置单独的 table。 Laravel Table Names
例如,如果您在 RefinanceLead 实例上使用 getId()
方法,它将 return id来自 refinance_lead table。如果您在 PurchadeLead 实例上使用它,它将从 purchade_table[ 中退出 id
class Lead extends Model
{
public function getId() {
return $this->id;
}
}
class RefinanceLead extends Lead
{
protected $table = 'refinance_leads';
}
class PurchaseLead extends Lead
{
protected $table = 'purchase_leads';
}
3. 我不知道你的确切需求是什么,但总的来说我会建议将 Lead class 抽象化,这样你就不需要为它关联一个 table 。仅使用它来分隔通用功能、关系等... 当然,正如评论中所建议的那样,实现一个接口总是一个好主意。
abstract class Lead extends Model implements LeadContract
{
// class body
}