为什么`select`不能替换现有的列?

时间:2017-07-22 18:57:54

标签: perl dbix-class

DOC select属性:

  

select表示应从存储

中选择哪些列

这可以按预期工作:

$rs->search( undef, { select => [ 'me.id', 'me.user_id' ] } )
   ->search( undef, { select => [ 'me.role_id' ] } )

$rs->as_query; # SELECT "me"."role_id" FROM "users_roles" "me"

但这不是:

$rs->search( undef, { prefetch => [ 'User' ] } )
   ->search( undef, { select => [ 'User.name' ] } )

$rs->as_query; # SELECT "User"."name", "User"."id", "User"."email", "User"."name" FROM "users_roles" "me"  JOIN "users" "User" ON "User"."id" = "me"."user_id"

prefetch隐含+columns+select+as)。
我只通过请求一列select

,在第二个search中更改name

我错过了什么?
为什么我仍然会获得列nameidemailname而不只是name列?

1 个答案:

答案 0 :(得分:0)

如果我通过加入重写prefetch。这很好用:

$rs->search( undef, { 
    ,join => [ 'User' ]
    ,collaplse => 1
    ,'+columns' => [map
        { +{ "cds.$_" => "cds.$_" } }
        $c->db->source('Right')->related_source('User')->columns
    ]
})->search( undef, { select => [ 'User.name' ] } )

$rs->as_query; # SELECT "User"."name" FROM "users_roles" "me"  JOIN "users" "User" ON "User"."id" = "me"."user_id"

所以似乎prefetch存在错误。由于join + collapse + +columnsprefetch不同:

DOC

  

此属性是指定“加入”规范的简写,将加入的相关来源中的所有列添加为“+列”并将“折叠”设置为真值。

另外,文档说明:

  

例如,以下两个查询是等效的

正如您所看到的,joinprefetch 不等同