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