在 Laravel 中只有一种方式的一对一关系

One-to-one relations that only go one way in Laravel

possible/right table 之间的关系是 单向 吗?我有一个 invoices table 需要在其他 table 中引用,例如 commission_paymentsmembership_payments 但是 invoices table不需要 commission_payment_idmembership_payment_id。换句话说,可能会发生不同类型的交易,它们都可能附有发票,但发票不需要引用这些交易 tables。

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

我已经为每个 table 创建了 Eloquent 个模型。我在其他两个模型上添加了 hasOneinvoices 的关系。

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

然后我尝试像这样访问佣金付款的附加发票:

$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 table 中查找 commission_payment_id 字段?我希望有这样的查询:

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

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

使用 hasOnebelongsTo 关系设置一对一关系。关系的 hasOne 端假定外键存储在另一端 table。关系的 belongsTo 端有外键。

因此,由于您的发票外键存储在 commission_payments 和 membership_payments table 中,因此这些模型属于发票 table .

将您的关系从 hasOne 更改为 belongsTo,您就可以开始了:

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