added join support
This commit is contained in:
parent
dd5d0639b2
commit
b2946d7650
1 changed files with 37 additions and 35 deletions
|
|
@ -33,7 +33,9 @@ Package WebGUI::Crud
|
|||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
CRUD = Create, Read, Update, and Delete. This package should be the base class for almost all database backed objects. It provides all the basics you will need when creating such objects, and creates a nice uniform class signature to boot.
|
||||
CRUD = Create, Read, Update, and Delete. This package should be the base class for almost all database backed objects. It provides all the basics you will need when creating such objects.
|
||||
|
||||
This package is very light weight compared to it's cousins (like DBIx::Class), and is very specific to WebGUI. That's because we aren't afraid of SQL, and don't want to automate everything. If you need something more powerful then consider DBIx::Class.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
|
|
@ -595,22 +597,22 @@ Here's an example of this structure:
|
|||
{ "color=? or color=?" => ['blue','black'] },
|
||||
]
|
||||
|
||||
=head4 join
|
||||
|
||||
An array reference containing the tables you wish to join together, and the mechanisms to join them. Here's an example.
|
||||
|
||||
[
|
||||
"anotherTable using (someId)",
|
||||
"yetAnotherTable on yetAnotherTable.this = anotherTable.that",
|
||||
]
|
||||
|
||||
=head4 limit
|
||||
|
||||
Either an integer representing the number of records to return, or an array reference of an integer of the starting record position and another integer representing the number of records to return.
|
||||
|
||||
=head4 orderBy
|
||||
|
||||
A field name to order the results by. Defaults to sequenceNumber. You can also specify a complex data structure for this. You can pass a hash reference which contains a field name and then ascending or descending like this:
|
||||
|
||||
{ "dateCreated" => "desc" }
|
||||
|
||||
Or you can have multiple order by clauses in an array reference like this:
|
||||
|
||||
[
|
||||
{ "objectType" => "asc" },
|
||||
{ "dateCreated" => "desc" },
|
||||
]
|
||||
A scalar containing an order by clause. Defaults to 'sequenceNumber'.
|
||||
|
||||
=head4 sequenceKeyValue
|
||||
|
||||
|
|
@ -626,10 +628,22 @@ sub getAllSql {
|
|||
unless ($session->isa('WebGUI::Session')) {
|
||||
$session = $someObject->session;
|
||||
}
|
||||
|
||||
# setup
|
||||
my $dbh = $session->db->dbh;
|
||||
my $tableName = $class->crud_getTableName($session);
|
||||
|
||||
# the base query
|
||||
my $sql = "select ".$dbh->quote_identifier($class->crud_getTableKey($session))." from ".$dbh->quote_identifier($class->crud_getTableName($session));
|
||||
my $sql = "select ".$dbh->quote_identifier($tableName, $class->crud_getTableKey($session))." from ".$dbh->quote_identifier($tableName);
|
||||
|
||||
# process joins
|
||||
my @joins;
|
||||
if (exists $options->{join}) {
|
||||
foreach my $thejoin (@{$options->{join}}) {
|
||||
push @joins, " left join ".$thejoin;
|
||||
}
|
||||
}
|
||||
$sql .= join(" ", @joins);
|
||||
|
||||
# process constraints
|
||||
my @params;
|
||||
|
|
@ -652,7 +666,7 @@ sub getAllSql {
|
|||
my $sequenceKey = $class->crud_getSequenceKey($session);
|
||||
if (exists $options->{sequenceKeyValue} && $sequenceKey) {
|
||||
push @params, $options->{sequenceKeyValue};
|
||||
push @where, $dbh->quote_identifier($sequenceKey)."=?";
|
||||
push @where, $dbh->quote_identifier($tableName, $sequenceKey)."=?";
|
||||
}
|
||||
|
||||
# merge all clauses with the main query
|
||||
|
|
@ -660,6 +674,13 @@ sub getAllSql {
|
|||
$sql .= " where ".join(" AND ", @where);
|
||||
}
|
||||
|
||||
# custom order by field
|
||||
my $order = " order by ".$dbh->quote_identifier($tableName, 'sequenceNumber');
|
||||
if (exists $options->{orderBy}) {
|
||||
$order = " order by ".$options->{orderBy};
|
||||
}
|
||||
$sql .= $order;
|
||||
|
||||
# construct a record limit
|
||||
my $limit;
|
||||
if ( exists $options->{limit}) {
|
||||
|
|
@ -670,28 +691,9 @@ sub getAllSql {
|
|||
$limit = " limit ".$options->{limit};
|
||||
}
|
||||
}
|
||||
$sql .= $limit;
|
||||
|
||||
# custom order by field
|
||||
my $order = " order by sequenceNumber";
|
||||
if (exists $options->{orderBy}) {
|
||||
if (ref $options->{orderBy} eq "ARRAY") {
|
||||
my @clauses = ();
|
||||
foreach my $pair (@{$options->{orderBy}}) {
|
||||
my ($field) = keys %{$pair};
|
||||
push @clauses, $dbh->quote_identifier($field)." ".$pair->{$field};
|
||||
}
|
||||
$order = " order by ". join(", ", @clauses);
|
||||
}
|
||||
elsif (ref $options->{orderBy} eq "HASH") {
|
||||
my ($field) = keys %{$options->{orderBy}};
|
||||
$order = " order by ".$dbh->quote_identifier($field)." ".$options->{orderBy}{$field};
|
||||
}
|
||||
else {
|
||||
$order = " order by ".$dbh->quote_identifier($options->{orderBy});
|
||||
}
|
||||
}
|
||||
|
||||
return $sql . $order . $limit, \ @params;
|
||||
return $sql, \@params;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue