如何建立一个通过或条件在多个外键上连接的hasone关联



我试图从另一个表(端口(两次加入表(连接(。

条件是:

  • 一个端口可以有一个或没有连接
  • 一个连接有一个从港口和一个端口的连接

结构是:

表端口:

  • id
  • 数字

表连接:

  • id
  • port_from_id
  • port_to_id
  • 名称

所以现在我想从端口加入连接。

蛋糕总是给我的:

LEFT JOIN connections Connections ON Ports.id = (Connections.port_from_id)

,但必须是:

LEFT JOIN connections Connections ON Ports.id = (Connections.port_from_id) OR Ports.id = (Connections.port_to_id)

或等效的东西。

我的端口模型实际上是这样的:

$this->hasOne('Connections', [
            'foreignKey' => 'port_from_id',
            'joinType' => 'LEFT'
        ]);

我如何在连接中获得"或条件"?

谢谢!

您必须禁用联想外键处理(IIRC仅适用于使用hasOne策略的CC_1关联,它也适用于belongsTo(,并自行提供条件,因为不支持多个外国密钥(与复合外国钥匙不同(。

沿着:

的线条
use CakeDatabaseExpressionIdentifierExpression;
// ...
$this->hasOne('Connections', [
    'foreignKey' => false,
    'conditions' => [
        'OR' => [
            'Connections.port_from_id' => new IdentifierExpression($this->aliasField('id')),
            'Connections.port_to_id' => new IdentifierExpression($this->aliasField('id')),
        ]
    ]
]);

应该创建类似于:

的SQL
LEFT JOIN
    `connections` `Connections` ON (
        `Connections`.`port_from_id` = (`Ports`.`id`) OR
        `Connections`.`port_to_id` = (`Ports`.`id`)
    )

另请参见

  • cookbook>数据库访问&ORM> sosidemiations> hasone关联

最新更新