1

Возможно ли/иметь право иметь отношение между таблицами, что идет только в одну сторону? У меня есть таблица invoices, которой мне нужно ссылаться в других таблицах нравится commission_payments и membership_payments, но таблица invoices не нужна commission_payment_id или membership_payment_id. Другими словами, существуют различные типы транзакций, которые могут произойти, и все они могут иметь счет-фактуру, но счет-фактура не требует ссылки на эти таблицы транзакций.Индивидуальные отношения, которые идут только в одном направлении в Laravel

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

Я создал яркие модели для каждой таблицы. Я добавил hasOne отношение к invoices на двух других моделях.

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) 

Почему ищет commission_payment_id поля в invoices таблице ? Я бы ожидать запрос вроде этого:

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

Должен ли я добавить столбец для каждой таблицы, которая будет ссылаться на invoice_id? На данный момент это два, но это может расти. Кроме того, когда для оплаты комиссии был создан счет-фактура, ему не потребуется поле для членства, поэтому я не думаю, что он должен туда идти.

ответ

3

Отношения «один к одному» устанавливаются с использованием либо отношений hasOne, либо belongsTo. Сторона отношения hasOne предполагает, что внешний ключ хранится на другой таблице. Сторона отношения belongsTo имеет внешний ключ.

Таким образом, поскольку ваш внешний ключ к счетам хранится в таблицах Commission_payments и membership_payments, эти модели, как говорят, относятся к таблице счетов-фактур.

Изменение отношения с hasOne к belongsTo, и вы должны быть хорошо идти:

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

Это один всегда смущало меня, очень хорошее объяснение. –

+0

Спасибо за разъяснение! Это действительно помогает! – metamaker