我们有一个表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在其定义上设置了外键定义,我仍然收到列不存在的错误...
我是否正在忽略某些内容,或者这是框架中的错误?
您会建议另一条对您更有意义的途径吗?对我来说,这现在很合理,但是可能还有另一种解决方案...
我也可以不做模型绑定,而自己在控制器中获取模型,但是我想保持代码尽可能整洁,并在设置路由时尽可能使用模型绑定。
如果您到达这里,谢谢阅读。
相关分类