Perl 为什么“select”不替换现有列?
对于Perl 为什么“select”不替换现有列?,perl,dbix-class,Perl,Dbix Class,对于选择属性: 选择指示应从存储器中选择哪些列 这与预期的效果一样: $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->searc
选择属性:
选择指示应从存储器中选择哪些列
这与预期的效果一样:
$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"
这意味着+列
(即:+选择
和+作为
)。
我在第二个搜索中更改选择
,只请求一列:名称
我错过了什么?
为什么我仍然得到列name
,id
,email
,name
,而不是只有一个name
?如果我通过join重写预回迁
。这很好:
$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
似乎有一个bug。因为连接
+折叠
++列
与预取
不同:
此属性是指定“联接”规范、将联接相关源中的所有列添加为“+columns”并将“collapse”设置为真值的缩写
还指出:
例如,以下两个查询是等效的
正如您所看到的,join
和prefetch
是不等价的相关的。@nwellnhof:谢谢您的链接,但实际上我并不排除。我说:“只选择一列”,但它也会选择另一列。这是多余的。线程仍然有些关联。无论如何,prefetch
只是独立于select
工作。您是否尝试过get\u column
?正如在$rs->get_列('name')
中一样,select
用于告诉它要从正在查询的表中选择什么。但是,prefetch
更像是一个从其他表中获取相关行的插件,因此您将拥有一个多连接查询,而不是稍后执行多个单独的查询。你不能要求它只预取几列。我想如果您使用join
而不是prefetch
构建join-yourself,您可以告诉它只获取User.name
。