首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为DBIx::Class ORM强制连接类型?

如何为DBIx::Class ORM强制连接类型?
EN

Stack Overflow用户
提问于 2017-10-23 19:07:53
回答 1查看 192关注 0票数 2

我有代码:

代码语言:javascript
复制
$self->search_related( 'Servers', {
    'Servers.active' => 'yes',
    'Ips.state'      => 0,
},{
    join => { Subnets => 'Ips' }
})->as_query;

这会产生:

代码语言:javascript
复制
SELECT "me"."id", "me"."active", "me"."ip_id", "me"."locality_id", "me"."hostname", "me"."ca_certificate", "me"."openvpn_static_key", "me"."l2tp_key", "me"."description", "me"."notes" 
FROM "servers" "me" 
LEFT JOIN "subnets" "Subnets" ON "Subnets"."server_id" = "me"."id" 
LEFT JOIN "ips" "Ips" ON "Ips"."subnet_id" = "Subnets"."id" 
WHERE ( ( "Ips"."state" = ? AND "Servers"."active" = ? AND "me"."locality_id" = ? ) )

我可以通过以下方式重写此代码:

代码语言:javascript
复制
$self->search_related( 'Servers', { active => 'yes' } )
  ->search_related( 'Subnets' )
  ->search_related( 'Ips', { state => 0 } )
  ->as_query

这将产生以下结果:

代码语言:javascript
复制
SELECT "Ips"."id", "Ips"."subnet_id", "Ips"."ip", "Ips"."package_id", "Ips"."state", "Ips"."notes" 
FROM "servers" "me"  
JOIN "subnets" "Subnets" ON "Subnets"."server_id" = "me"."id"  
JOIN "ips" "Ips" ON "Ips"."subnet_id" = "Subnets"."id" 
WHERE ( ( "active" = ? AND "me"."locality_id" = ? AND "state" = ? ) )

但是有没有办法用first case force JOIN代替LEFT JOIN呢?

EN

回答 1

Stack Overflow用户

发布于 2017-10-24 00:29:50

联接类型由DBIC架构中的关系定义。当你需要一个不同的连接类型进行搜索时,建议只定义另一个连接类型的关系,例如has_many('Subnets_full_join', ...),并在搜索中使用它,而不是常规的连接类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46887880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档