Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么“select”不替换现有列?_Perl_Dbix Class - Fatal编程技术网

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