Вы были на правильном пути. as_query
- это то, что вам нужно. Но вам также понадобится опция columns
во втором хешире. Убедитесь, что вы используете count_rs
для подзапроса, который переворачивает внутренний переключатель, чтобы создать набор результатов с COUNT(*)
в нем.
my $obj = ResultSet('TableOne')->search(
{
z => 123,
},
{
columns => [
'x',
{
c => ResultSet('TableTwo')->search(
{
'y' => {
-ident => 'me.x',
},
},
{
alias => 'sub_query', # this name is arbitrary
},
)->count_rs->as_query,
},
],
}
)->first;
Результирующий запрос будет выглядеть примерно так:
SELECT me.x, (
SELECT COUNT( * )
FROM table_two sub_query
WHERE y = me.x
)
FROM table_one me
WHERE me.z = 123
Как видите, значение, которое мы выбрали с помощью подзапроса, не называется c
в SQL, но оно называется c
в данных объекта.
use DDP;
p $obj;
DB::Result::TableOne {
# ...
internals: {
_column_data {
x "foo",
c "bar"
},
_in_storage 1,
_result_source DBIx::Class::ResultSource::Table
}
}
Вы можете получить к нему доступ с помощью get_column
для объекта строки.
say $obj->get_column('c');
# bar