为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用相互继承的Laravel雄辩模型使关系正常工作

如何使用相互继承的Laravel雄辩模型使关系正常工作

慕姐4208626 2021-04-28 13:42:10
我们有一个表invoices,其中有一个可为空的字段number。我们的业务逻辑如下。每当我们需要向客户收取服务更新费用时,我们都会向他们发送形式发票。形式发票可通过属性number为空来识别。每当我们要转换形式发票(手动或自动,因为客户付款)时,我们基本上要做的就是确定新编号并更新invoice.number。此功能效果很好。现在,我们希望有一条路线GET /api/invoices/201900001(您猜对了)应该可以提取发票WHERE number = 201900001。因此,我们将发票模型定义如下:class Invoice extends Model {    public function getRouteKeyName() {        return 'number';    }}工作出色。但是我想你知道我们还需要什么。我们还需要能够使用一条路径来获取形式发票GET /api/proformas/1,其中1实际上是记录的,id而不是number记录的,因为您知道我们不会为形式发票分配数字,而是仅在收取形式费用后才分配发票并将其转换为发票。因此,我们的第一个问题是,是否有一种方法可以为单个路由设置路由参数需要绑定到哪一列,但这似乎是不可能的,因此我们选择了另一条路由。如果您看到一个确实允许我同时支持绑定数字和ID的解决方案,那么请务必告诉我:-)无论如何,我们继续我们的工作,然后我们认为aProformaInvoice实际上是Invoice对象的特定子类型,因此我们继续为此目的创建了一个新模型:Class ProformaInvoice extends Invoice {    public function getRouteKeyName() {        // override parent's behaviour back to the default        return 'id';    }}哇-我们相信这是要解决我们的问题,但事实并非如此。因为您猜到了-我们也有InvoiceElements,并且它们链接到发票。因此,我们在发票模型上具有以下重要关系:Class Invoice extends Model {    public function getRouteKeyName() {        return 'number';    }    public function invoice_elements() {        return $this->hasMany(InvoiceElement::class);    }}由于我们现在拥有自己的ProformaInvoice模型,因此将实际向该类收取形式发票的逻辑(以前是在Invoice模型本身上)转移了:public function ProformInvoice extends Invoice {    public function getRouteKeyName() {        return 'id';    }    public function convertToInvoice() {        $minNumber = (date('Y') * 100000) + 1;        DB::statement(            "UPDATE invoices inv然而,令我惊讶的是,这并不能解决问题。proforma_invoice_id即使我明确invoice_id在其定义上设置了外键定义,我仍然收到列不存在的错误...我是否正在忽略某些内容,或者这是框架中的错误?您会建议另一条对您更有意义的途径吗?对我来说,这现在很合理,但是可能还有另一种解决方案...我也可以不做模型绑定,而自己在控制器中获取模型,但是我想保持代码尽可能整洁,并在设置路由时尽可能使用模型绑定。如果您到达这里,谢谢阅读。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信