我有这个模型:
Proforma
->hasMany('ItemProformas', ['foreignKey' => 'proforma_id']);
->belongsTo('Customers', ['foreignKey' => 'customer_id']);
->belongsTo('ProformaStates', ['foreignKey' => 'proforma_state_id']);
->hasMany('Invoices', ['foreignKey' => 'proforma_id']);
ItemProformas
->belongsTo('Proformas', ['foreignKey' => 'proforma_id', 'joinType' => 'INNER']);
->belongsTo('ItemDeliveryNotes', ['foreignKey' => 'item_delivery_note_id']);
ItemDeliveryNotes
->belongsTo('DeliveryNotes', ['foreignKey' => 'delivery_note_id', 'joinType' => 'INNER']);
->belongsTo('ItemOrders', ['foreignKey' => 'item_order_id']);
->belongsTo('ItemOrdersTypes', ['foreignKey' => 'item_orders_type_id']);
->belongsTo('Products', ['foreignKey' => 'product_id']);
每个 ItemProforma
可能有一个 ItemDeliveryNotes
,否则外键将 null
. 这是我的 paginate
电话:
$this->paginate = [
'contain' => [
'Customers',
'ProformaStates',
'ItemProformas' => ['ItemDeliveryNotes' => ['DeliveryNotes']]
]
];
有了这个模型,我得到了所有 itemProforma
那些有 item_delivery_note_id
设置。相反,我有兴趣得到他们所有,即使 item_delivery_note_id
是 null
.
我不确定 belongsTo
在这里是正确的(我的意思是 ItemProformas
定义)。但是 hasOne
意味着它有一个相关联的行,而不是可能有一个。
正确的语法是什么 itemProformas
即使他们没有 ItemDeliveryNote
相关?但如果他们有,我需要找回 ItemDeliveryNote
对象也是。
1条答案
按热度按时间polhcujo1#
关联类型取决于您的架构。如果外键在源表中,则为
belongsTo
,如果外键在目标表中,则为hasOne
.相关记录是否必须存在主要取决于模式,而不是关联的类型。如果外键可为空,则相关记录是可选的。如果以及如何实现在应用程序级别强制执行该约束则是另一回事。
话虽如此,
ItemDeliveryNotes
以及DeliveryNotes
两者都是belongsTo
默认情况下,这将使用联接,因此这两个关联将联接到同一个查询中,并且由于您已经配置了DeliveryNotes
关联以使用INNER
join,它将排除没有DeliveryNotes
存在,这当然也是不存在的情况ItemDeliveryNotes
存在。假设您的模式建模正确/正确,例如,您可以将关联配置更改为使用
LEFT
在适用的情况下,默认情况下连接,或者您可以在每个查询的基础上更改包含的配置(手动或使用自定义查找器):更改的获取策略
ItemDeliveryNotes
也可以工作(虽然它可能是相当繁重的取决于记录的数量),即使用select
战略而不是join
策略,然后ItemDeliveryNotes
记录将在单独的查询中检索,因此不会影响对的检索ItemProformas
: