has_many关系并在选择列表中计数,条件在何处(相关项目数)

时间:2019-06-12 15:49:24

标签: perl dbix-class

我有一个非常简单的DBIx :: Class模型,只有一个对象 Person 。 相关列为 id_person id_manager 姓名姓氏人属于经理可以是有许多下属的经理。

__PACKAGE__->has_many(
  "subordinates",
  "DBIx::Result::Person",
  { "foreign.id_manager" => "self.id_person" },
);

__PACKAGE__->belongs_to(
  "manager",
  "DBIx::Result::Person",
  { "foreign.id_person" => "self.id_person" },  
);

我如何: 1.搜索所有用户,然后在我的结果集中添加一列“下属人数” ,该列将列出所有用户及其下属人数,包括0?

这是唯一的解决方案,然后在后处理中检查“下属”属性的长度吗?

my $rs = $schema->resultset('Person')->search(
  undef,
  {
    prefetch => 'subordinates'
  }
);

本质上类似于:

SELECT
  person.*,
  ( SELECT
      count(*)
    FROM
      person subordinate
    WHERE 
      subordinate.id_manager = person.id_person
  ) AS subordinate_count
FROM
  person
;
  1. 仅返回其下属计数高于2的经理的下属计数吗?

    选择*从(   选择     人。,     ( 选择         计数()       从         人下属       哪里         subordinate.id_manager = person.id_person     )AS subordinate_count   从     人 )WHERE subordinate_count> 2
      ;

我已经尝试过类似的方法,但是我如何获得计数?

my $rs = $schema->resultset('Person')->search(
  {
    select => ['me.id_person'],
    group_by => ['me_id_person'],
    having => \[ count('subordinates.id_person) > ?', 2]
    join => 'subordinates',
  }
  1. 返回所有经理(包括0的经理)的下属计数,但仅计数名为“玛丽”的下属吗?我可以按组进行分组,但是这不会列出下属零的经理。随着那些被过滤。

这是我在纯SQL中想要的:

SELECT
  person.*,
  ( SELECT
      count(*)
    FROM
      person subordinate
    WHERE 
      subordinate.id_manager = person.id_person
      AND subordinate.name = 'Mary'
  ) AS subordinate_count
FROM
  person
;

0 个答案:

没有答案