猿问

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

我们有一个表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在其定义上设置了外键定义,我仍然收到列不存在的错误...


我是否正在忽略某些内容,或者这是框架中的错误?


您会建议另一条对您更有意义的途径吗?对我来说,这现在很合理,但是可能还有另一种解决方案...


我也可以不做模型绑定,而自己在控制器中获取模型,但是我想保持代码尽可能整洁,并在设置路由时尽可能使用模型绑定。


如果您到达这里,谢谢阅读。


慕姐4208626
浏览 107回答 1
1回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答