代码之家  ›  专栏  ›  技术社区  ›  Paul Hutchinson

如何在DBIx::Class::ResultSet上进行搜索和排序

  •  2
  • Paul Hutchinson  · 技术社区  · 15 年前


    数据库解决方案:

    它与Userfields表(又称“attributes”)有很多关系。

    它属于Useraccounts表(又名“useraccount”)和Customfields(又名“customfield”)


    我想要的建议select语句:

    这是一个select语句,它实现并产生了我需要的东西。

    SELECT ua.*, (
        SELECT content FROM Userfields uf
        INNER JOIN Customfields cf
            ON cf.id = uf.customfieldid
        WHERE cf.name = 'Mothers birthdate'
        AND uf.uid=ua.uid
    ) AS 'Mothers birthdate',
        (
        SELECT content FROM Userfields uf
        INNER JOIN Customfields cf
            ON cf.id = uf.customfieldid
        WHERE cf.name = 'Join Date' AND
        uf.uid=ua.uid
    ) AS 'Join Date'
    FROM UserAccounts ua
    ORDER BY 'Mothers birthdate';
    

    在这种情况下,它们可以是0。。。select语句中的x个子select语句,其中任何一个或任何一个语句都不希望被排序。


    如何使用->在我的dbix类结果集上搜索,或者如何在我的dbix类结果集上搜索得到相同的结果?

    下面是我通常如何从Useraccounts表中进行选择,尽管我不确定如何从这里执行我想要的复杂语句。

    my @users = $db->resultset('Useraccounts')->search(
        undef,
        {
            page        => $page,
            join        => 'attributes',
            ...
        });
    

    谢谢你的时间。

    1 回复  |  直到 15 年前
        1
  •  3
  •   palik    7 年前

    这真的很棘手,任何解决方案都不会很漂亮,但是 如果你稍微改变一下规则,看起来是可能的。原谅我犯的任何错误,因为我没有去创建一个模式来测试这个,但是它是基于我所拥有的最好的信息(以及来自ribasushi的很多帮助)。

    首先,(假设您的userfields表与customfields表有一个归属关系,称为 customfield

    my $mbd = $userfields_rs->search(
        {
          'customfield.name' => 'Mothers birthdate',
          'uf.uid' => \'me.uid' # reference to outer query
        },
        {
          join => 'customfield',
          alias => 'uf', # don't shadow the 'me' alias here.
        }
    )->get_column('content')->as_query;
    
    # Subqueries and -as don't currently mix, so hack the SQL ourselves
    $mbd->[0] .= q{ AS 'Mothers Birthdate'};
    

    文字 me.uid uid me 不管怎样,你可以重复一遍 as_query 业务中可以有任意多个不同的字段,只要改变字段名(如果您很聪明,您将编写一个方法来生成它们),并将它们放入一个数组中,那么现在让我们假设 @field_queries 是一个数组,包含 $mbd 以上以及另一个基于加入日期,和任何你喜欢的。

    一旦你有了它,它就像。。。

    my $users = $useraccounts_rs->search(
        { }, # any search criteria can go in here,
        {
          '+select' => [ @field_queries ],
          '+as' => [qw/mothers_birthdate join_date/], # this is not SQL AS
          order_by => {-asc => 'Mothers birthdate'},
        }
    );
    

    可悲的是,到目前为止,这整件事 不会 因为带有占位符的子查询不能正常工作。所以现在你需要一个额外的解决方法:而不是 'customfield.name' => 'Mothers birthdate' 在子选择搜索中,执行 'customfield.name' => \q{'Mothers birthdate'} 小心 这里是SQL注入的一部分!),这将避开占位符错误。但是在不远的将来,这个bug会被解决,上面的代码也会正常工作,我们会更新答案让你知道是这样的。

    请参阅DBIx::Class::ResultSource order_by documentation