cakephp关联:句柄null id

jgwigjjp  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(315)

我有这个模型:

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_idnull .
我不确定 belongsTo 在这里是正确的(我的意思是 ItemProformas 定义)。但是 hasOne 意味着它有一个相关联的行,而不是可能有一个。
正确的语法是什么 itemProformas 即使他们没有 ItemDeliveryNote 相关?但如果他们有,我需要找回 ItemDeliveryNote 对象也是。

polhcujo

polhcujo1#

关联类型取决于您的架构。如果外键在源表中,则为 belongsTo ,如果外键在目标表中,则为 hasOne .
相关记录是否必须存在主要取决于模式,而不是关联的类型。如果外键可为空,则相关记录是可选的。如果以及如何实现在应用程序级别强制执行该约束则是另一回事。
话虽如此, ItemDeliveryNotes 以及 DeliveryNotes 两者都是 belongsTo 默认情况下,这将使用联接,因此这两个关联将联接到同一个查询中,并且由于您已经配置了 DeliveryNotes 关联以使用 INNER join,它将排除没有 DeliveryNotes 存在,这当然也是不存在的情况 ItemDeliveryNotes 存在。
假设您的模式建模正确/正确,例如,您可以将关联配置更改为使用 LEFT 在适用的情况下,默认情况下连接,或者您可以在每个查询的基础上更改包含的配置(手动或使用自定义查找器):

$this->paginate = [
    'contain' => [
        'Customers',
        'ProformaStates',
        'ItemProformas' => [
            'ItemDeliveryNotes' => [
                'DeliveryNotes' => [
                    'joinType' => \Cake\Database\Query::JOIN_TYPE_LEFT,
                ],
            ],
        ],
    ],
];

更改的获取策略 ItemDeliveryNotes 也可以工作(虽然它可能是相当繁重的取决于记录的数量),即使用 select 战略而不是 join 策略,然后 ItemDeliveryNotes 记录将在单独的查询中检索,因此不会影响对的检索 ItemProformas :

$this->paginate = [
    'contain' => [
        'Customers',
        'ProformaStates',
        'ItemProformas' => [
            'ItemDeliveryNotes' => [
                'strategy' => \Cake\ORM\Association::STRATEGY_SELECT,
                'DeliveryNotes',
            ],
        ],
    ],
];

相关问题