1

是否有可能/正确的表间关系只能走一条路?我有一个invoices表,我需要在其他表中参考,如commission_paymentsmembership_payments,但invoices表不需要commission_payment_idmembership_payment_id。换句话说,可能发生不同类型的交易,并且他们都可能附有发票,但发票不需要引用这些交易表。一对一的关系,只有在Laravel的一种方式

invoices   commission_payments  membership_payments 
--------------- --------------------- --------------------- 
-id    -id      -id 
...    -invoice_id    -invoice_id 
        ...      ... 

我已经为每个表格创建了Eloquent模型。我在其他两个型号上增加了hasOneinvoices的关系。

class CommissionPayment extends Model{ 
    public function invoice(){ 
     return $this->hasOne('App\Models\Invoice'); 
    } 
} 

我又试图访问Comission付款的附加发票这样的:

$com = CommissionPayment::first(); 
$com->invoice->id; 

然后我得到这个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'invoices.commission_payment_id' in 'where clause' (SQL: select * from `invoices` 
where `invoices`.`commission_payment_id` = 15 and `invoices`.`commission_payment_id` is not 
null limit 1) 

为什么在invoices表寻找commission_payment_id场?我期望这样的查询排序:

SELECT * FROM `invoices` WHERE `id` = 23 
/* id is fetched from the `invoice_id` field in the `commission_payments` table */ 

我需要为每个将引用invoice_id的表添加一列吗?目前这是两个,但这可能会增长。另外,当为佣金支付生成发票时,它不需要会员支付字段,所以我认为它不应该到那里。

回答

3

使用hasOnebelongsTo关系设置一对一关系。关系的hasOne一侧假定外键存储在另一个表上。关系的belongsTo一侧有外键。

因此,由于您的发票外键存储在commission_payments和membership_payments表中,因此这些模型被认为属于发票表。

更改从hasOne你们的关系belongsTo,你应该是好去:

class CommissionPayment extends Model{ 
    public function invoice() { 
     return $this->belongsTo('App\Models\Invoice'); 
    } 
} 
+1

这一个总是搞糊涂了,很能说明问题。 –

+0

感谢您的解释!这真的有帮助! – metamaker