ORM не плохое есть некотоыре хорошие вещи с ООП запросами...
вот я превел пример, не плохо
но зачем экономить на спичках?
если нужно сделать построение программного запроса, то можно через if else
и сделать нормально:
ты настаиваешь на том чтобы использовать это? оно лучше, но не намного...
а тебя спасает это ORM?
Код: Выделить всё
package AddressBook::Controller::Address;
use strict;
use warnings;
use base qw(Catalyst::Controller::FormBuilder Catalyst::Controller::
BindLex');
sub add : Local Form('/address/edit') {
my ($self, $c, $person_id) = @_;
$c->stash->{template} = 'address/edit.tt2';
$c->forward('edit', [undef, $person_id]);
}
sub edit : Local Form {
my ($self, $c, $address_id, $person_id) = @_;
my $address : Stashed;
if(!$address_id && $person_id){
# we're adding a new address to $person
# check that person exists
my $person = $c->model('AddressDB::People')->
find({id => $person_id});
if(!$person){
$c->stash->{error} = 'No such person!';
$c->detach('/person/list');
}
# create the new address
$address = $c->model('AddressDB::Addresses')->
new({person => $person});
}
else {
$address = $c->model('AddressDB::Addresses')->
find({id => $address_id});
if(!$address){
$c->stash->{error} = 'No such address!';
$c->detach('/person/list');
}
}
if ($c->form->submitted && $c->form->validate){
# transfer data from form to database
$address->location($c->form->field('location'));
$address->postal ($c->form->field('postal' ));
$address->phone ($c->form->field('phone' ));
$address->email ($c->form->field('email' ));
$address->insert_or_update;
$c->stash->{message} =
($address_id > 0 ? 'Updated ' : 'Added new ').
'address for '. $address->person->name;
$c->detach('/person/list');
}
else {
# transfer data from database to form
if(!$address_id){
$c->stash->{message} = 'Adding a new address ';
}
else {
$c->stash->{message} = 'Updating an address ';
}
$c->stash->{message} .= ' for '. $address->person->name;
$c->form->field(name => 'location',
value => $address->location);
$c->form->field(name => 'postal',
value => $address->postal);
$c->form->field(name => 'phone',
value => $address->phone);
$c->form->field(name => 'email',
value => $address->email);
}
}
sub delete : Local {
my ($self, $c, $address_id) = @_;
my $address = $c->model('AddressDB::Addresses')->
find({id => $address_id});
if($address){
# "Deleted First Last's Home address"
$c->stash->{message} =
'Deleted ' . $address->person->name. q{'s }.
$address->location. ' address';
$address->delete;
}
else {
$c->stash->{error} = 'No such address';
}
$c->forward('/person/list');
}
1;